谨记:对于字符数组,我们要跟字符串区分开!!
下面进入笔者的指针和数组试题解析部分!
#include <stdio.h> int main() { const char* p = "abcdef"; printf("%d\n", sizeof(p)); //4 printf("%d\n", sizeof(p+1)); //4 printf("%d\n", sizeof(*p)); //1 printf("%d\n", sizeof(p[0])); //1 printf("%d\n", sizeof(&p)); //4 printf("%d\n", sizeof(&p+1)); //4 printf("%d\n", sizeof(&p[0]+1)); //4 return 0; }
注意,笔者的代码是在vs2022 的x86环境下进行演示的!请注意细节,若是在vs2022的x64环境下,将会出现不一样的结果!但那个结果也是正确的!
若是有老铁能直接看懂,并且能够跟答案对上号,那么这篇博客,这位老铁就没有看的必要了,下面内容主要是对上面的代码的讲解!并不做其他的内容!但若是有兴趣,可以进一步欣赏!
下面进入讲解部分
对于: char* p = "abcdef"; 而言:使用 :const char* p = "abcdef";确实比较好!因为字符串:“abcdef"是常量,不可以修改,所以用const 修饰,没有什么大问题!
而”abcdef"作为字符串,表达式的值就是a的地址!因此将a的地址放在p里面去,而“abcdef"是字符串常量,若要让p进行维护,p可能会对字符串”abcdef"进行更改!但是由于常量字符串不能被修改!而p却是有能力(可以)去修改“abcdef",所以前面加const 显得更加严谨!!!
1.sizeof(p) : p是一个指针变量,是用来存放地址的!指针(地址)的大小就是4/8个字节!
2.sizeof(p+1) : p里面存放的是地址!是char* 类型的指针!p+1指:char* 的指针+1,但之后还是个地址!是地址就是4/8个字节!
3.sizeof(*p) : p为char* 类型的指针,对其解引用,只能访问1个字节!
4. sizeof(p[0]) : p[0]相当于:*(p+0),就是第一个元素的大小,1个字节!
*p相当于*(p+0),也相当于:p[0]
5. sizeof(&p) : &p取出的是整个数组的地址!但是整个数组的地址也是地址!是地址就是4/8个字节!
6.sizeof(&p+1) : &p 是去除数组首元素的地址,而&p+1跳出整个数组,但是仍然是数组:4/8个字节!
7.sizeof(&p[0]+1) : &p[0] 取出的是数组首元素的地址!而&p[0]+1 则是往后走一个字节,指的是数组第二个元素的地址!仍然为:4/8个字节!
上述代码的运行结果为:
本篇文章就到此结束!有不同疑问,请及时与笔者进行联系!!