一、指针与地址
题目
int a=6 ;
int *p=&a;
int **p1=&p;
int &p2=p;
请问一下结果中值为6的是?
A:&p
B:**p1
C:*p2
D:*p1
分析
如何理解 int a =6
这句代码的意思是在内存中开辟0x3848921
这块地址大小为int的空间来存放一个int型数据6。并给这段空间取别名为a
因此,a
表示为这段空间的内容 6, &a
表示该段空间的起始地址0x3848921
如何理解int *p =&a
?
int *p=&a;
其实表示的意思是int *p; p=&a
,含义就是p指向a
其含义表示为在内存中开辟了0x3256567开始的大小为8byte的空间来存放a的地址
如何理解int **p1=&p
其表示的是int **p1; p1=&p
也就是说p1中存放的是p的地址
如何理解 int &p2==p
?
这个表述是错误的,因为在内存中我们并没有申明一块空间为p2呀,那么如何进行&p2(取p2的地址)
呢?
分析A选项:
p中存放的是a的地址,而&p表示的是取p这块空间的地址,所以答案肯定不是6,而是0x325657
分析B选项:
p1中存放的是p的地址,那么*p1表示的是p1中存放的地址(p的地址)的空间中存放的内容即a的地址。那么 **p1表示的就是p中存放的地址(a的地址)的内容即6。因此B正确
分析C选项:
p2,根本没有声明p2,怎么p2呢?
分析D选项:
p1,表示的是p1所指向的地址内容,p1中存放的地址是p的地址,那么p的内容就是a的地址,那么p1就是a的地址 0x3848921
答案
因此答案是B **p1
二、const修饰字符串
例题
char* const strA="hello world";
const char* strB="hello world";
下面操作正确的是
A:strA[0]='H';
B:strB[0]='H';
C:strA="123";
D:strB="123";
分析
char * const strA="hello world"
表示的是strA所指向的空间是"hello world"字符常量,且strA所指的地址无法改变
const char* strB="hello world"
表示的是strB所指向的空间是"hello world"字符常量,且strB所指的地址是可以改变的但是其内容可以改变
答案
选择D
三、 升级一下第二题
char str[]="hello world";
char* const strA=str;
const char* strB=str;
下面操作正确的是
A:strA[0]='H';
B:strB[0]='H';
C:strA="123";
D:strB="123";
正确答案
AD
总结
关于最后一题,大佬可以自行跳过,有经过该文章明白其知识点的朋友欢迎大家评论区分析