对于指针我还想搞得更明白一些,于是又有了新的问题:
NODE *u
u=(NODE *)malloc(sizeof(NODE))
此处申请了一个大小是NODE的内存空间
int *b
b=(int *)malloc(sizeof(int) * (m+1));
此处m=5,但我不知道sizeof(int)后边的 * (m+1)应当怎么理解?它到底申请了多大的内存空间?* (m+1)在此处的功用是什么?
程序
int i[]={1,5,9};
int *q;
q=i;
printf("%d",*q);
printf(" \n %d",q);
printf( "\n %d",&q);
printf ("\n %p",q);
printf("\n %p",&q);
printf("\n %X",q);
printf("\n %X",&q);
输出:
1
-44
-38
FFD4
FFDA
FFD4
FFDA
我的问题是使用&以后和不使用&到底输出的是什么,那个才是内存地址?二者有没有关系,似乎它们有个相对比较小的差值。
使用P是输出指针的值,而这个值应当是内存地址的值对吗?如果说它们是内存地址,那么用X也是输出内存地址了,对吗?另外P与X两个输出格式参数之间有什么关系?当然我知道X是输出无符号以十六进制表示的整数,P是输出指针的值,我的本意是此处它们有什么区别,它们本质区别又是什么?关于这个问题我又进行了如下测试,不知能否在回答上边问题以后再把以下输出结果分析一下?
int a=3;
printf("%p \n",a);
printf("%p \n",&a);
printf("%x \n",a);
printf("%x \n",&a);
0003
FFDA
3
ffda
当然这些输出格式的参数不应当如此使用,在此我完全是希望能够正确区分两个参数的功用。 最后写一句,由于我还进行了别的测试,测试例子太杂,我没有都写出来,个人感觉是P是输出了一个标准的4位长度数的16位数,首位不足补零,而X也是输出16位数,但它使用实际数据的长度。仅仅是格式上的区别,没有什么本质上的区别,当然由于我的测试带有个人的片面性,肯定有不正确的地方,得出的结论也肯定有问题,希望能够得到指正。
b=(int *)malloc(sizeof(int) * (m+1));
那显然是申请了m+1个整数大大小的空间啊,如果在32位系统中,sizeof(int)为4,所以就相当于:
b = (int*)malloc(24);
显然这块空间可以装下6个整数,因此在效果上可以当作
int b[6];
来使用。
p是个指针变量,输出p就是输出这个指针指向的地址的值,而指针变量的值就是它指向的地址的值。
指针变量本身也是个变量,只要是变量,那么它本身也需要有内存空间来保存它的值,而&p就是这块内存的地址。
在这一点上,指针变量和数组名是不同的。比如说,
int a[6];
那么a和&a是一样的,原因是数组名仅仅是个常地址,而不是个指针变量,C/C++规定&a和a含义相同。
我觉得"%p"和"%x"的区别很小,原因是大家习惯于用16进制来显示地址,而不是10进制或8进制。"%x"是输出16进制数,而"%p"是按一种大家习惯的标注格式来显示16进制数,即固定4位16进制数,a到z大写,也就是说,"%p"相当于"%04X"。
b=(int *)malloc(sizeof(int) * (m+1));
这个通常用来处理地址连续的线性表, 用处不大。
和一楼的老大说的是一样的, 数组就是一种线性表,。
优先级:++>*>+