我目前正在学习C中的指针和数组。以下问题几天来一直困扰着我。请澄清。
假设我声明一个这样的整数数组:
int a[]={1,2,3,4,5}
我们知道数组的基地址是指向数组第一个元素的指针。因此,如果我们尝试执行命令:
printf("%u ",a);
将打印基地址,即1
的地址。现在,如果我们尝试执行以下语句:
printf("%u",&a);
那么&a
是不是指向指针的指针,应该打印包含整数数组基本元素地址的变量的地址?相反,我得到的是a
和&a
的相同值。
缺陷在哪里?请解释一下。
答案 0 :(得分:0)
数组不是指针:
int arr[10]
:
使用的内存量为sizeof(int)*10
字节
arr
和&arr
的值必须相同
arr
指向有效的内存地址,但不能设置为指向另一个内存地址
int* ptr = malloc(sizeof(int)*10)
:
使用的内存量为sizeof(int*) + sizeof(int)*10
字节
ptr
和&ptr
的值不一定相同(事实上,它们大多不同)
ptr
可以设置为指向有效和无效的内存地址,可以多次使用
答案 1 :(得分:0)
a被定义为数组类型的对象
int a[]={1,2,3,4,5};
以sizeof(a)计算的对象大小等于5 * sizeof(int),如果sizeof(int)等于4,则对象的大小等于20.
Expression& a给出了对象的地址。它的类型是int ( * )[5]
。你可以写
int ( *p )[5] = &a;
如果你要增加p
++p;
然后p将具有比p的原始值大20个字节的值。
表达式a的类型为int *
。
来自C标准
3除非它是sizeof运算符或一元&的操作数。 operator,或者是用于初始化数组的字符串文字,a 具有类型''数组类型''的表达式将转换为 带有''指向类型'的指针的表达式,指向初始值 数组对象的元素,而不是左值。如果是数组对象 具有寄存器存储类,行为未定义。
你可以写
int * q = a;
如果你要增加q
++q;
然后q将具有大于q的原始值的4个字节(sizeof(int))的值。
p和q都处理相同的内存。只有它们能够处理不同类型和大小的物体。