如何回答有关常量指针的面试测试?

Reg*_*ser 16 c pointers

我接受了一次采访,他们问了我这个问题

#include<stdio.h>
int main ()
{
int* const p=NULL;
int const *q=NULL;
p++;
q++;
printf("%d\n",p);
printf("%d\n",q);
}
Run Code Online (Sandbox Code Playgroud)

以上程序将如何表现

a)p将增加4个字节;
和q也将增加4个字节;

b)p将为零
q将指向前面4个字节的存储器;

c)错误将出现在上述程序中

我无法理解这些陈述之间的区别

int* const p=NULL;
int const *q=NULL;
Run Code Online (Sandbox Code Playgroud)

dra*_*135 28

int* const p=NULL;

p是一个指向整数的常量指针.指针IS常量(指针值不能改变); 指向的整数不是常量(可以修改整数值).

所以声明:

p++;
Run Code Online (Sandbox Code Playgroud)

将无法编译因为尝试修改常量值(指针).

声明:

(*p)++;
Run Code Online (Sandbox Code Playgroud)

将增加指针指向的整数值p(但因为p已分配NULL,它将是未定义的行为)


int const *q=NULL;

q是一个指向常量整数的指针.指针不是常量(指针值可以改变); 指向IS常量的整数(不能修改整数值).

所以声明:

q++;
Run Code Online (Sandbox Code Playgroud)

将修改指针q指向前面4个字节的内存(假设sizeof(int)为4).(因为q被赋值NULL,q将是0x4 - 我假设NULL为零(在所有当前实现中都是如此),递增NULL指针实际上是未定义的行为)

声明:

(*q)++;
Run Code Online (Sandbox Code Playgroud)

将无法编译因为尝试修改常量值(指向的整数是常量)

  • 总结一下:向后阅读声明. (7认同)

Jam*_*lis 25

以上程序将如何表现?

这个答案很简单:程序不会编译.

后缀++需要一个可修改的左值作为其参数; p是不可修改的,因为它是const合格的.

const*,该指针是合格的装置; 如果它const出现在*声明之前q,则表示指针引用的对象是合格的.您可以使用顺时针/螺旋规则解码C声明符语法.


如果p从程序中删除所有对它的引用以便只q保留包含的行,则答案是程序显示未定义的行为:您不能对空指针执行算术运算(至少如果结果不是空指针则不行) .