逻辑中的缺陷是什么?

时间:2014-10-10 11:03:36

标签: c pointers

我目前正在学习C中的指针和数组。以下问题几天来一直困扰着我。请澄清。

假设我声明一个这样的整数数组:

int a[]={1,2,3,4,5}

我们知道数组的基地址是指向数组第一个元素的指针。因此,如果我们尝试执行命令:

printf("%u ",a);

将打印基地址,即1的地址。现在,如果我们尝试执行以下语句:

printf("%u",&a);

那么&a是不是指向指针的指针,应该打印包含整数数组基本元素地址的变量的地址?相反,我得到的是a&a的相同值。

缺陷在哪里?请解释一下。

2 个答案:

答案 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都处理相同的内存。只有它们能够处理不同类型和大小的物体。