本文共 2618 字,大约阅读时间需要 8 分钟。
#includeint main() { char data = 'a'; char* p = &data; printf("%c \n", *p); printf("===============\n"); char dd = 'd'; p = ⅆ // 指针可以指向其他内存地址 printf("%c \n", *p); printf("===============\n"); *p = 'e'; // 可以通过指针内存的值 printf("%c \n", dd);}
a===============d===============e
重点:const修饰什么,什么就不能被改变!!!
- char * const p 中,const修饰的是p,所以p(指针指向的内存地址)不能改变,也就是指针常量,不能指向其他的地址了!
- 但是,指针指向的值(内存保存的值)可以改变
#includeint main() { char data = 'a'; char buf = 'b'; printf("%p \n", &data); printf("==============\n"); char* const p = &data; printf("%p \n", p); //p = &buf; //error:assignment of read-only variable‘p’ *p = 'A'; printf("==============\n"); printf("%p \n", p); printf("%c \n", *p);}
00CFFE43 // data 变量的地址==============00CFFE43 // 指针p指向data之后,指针p的地址==============00CFFE43 // 指针解引用*p,修改某地址中的值之后,指针p的内存地址还是没变A
- 指针常量-----char* const p ,const修饰指针p,说明p不能指向其他地址了!
- 通过*p = 'A’可以改变了这个内存地址的值,p的指向还是之前的地址
重点:const修饰什么,什么就不能被改变!!!
- const 修饰的是 *p, 而*p代表解引用,代表是的某个内存地址保存的值,所以*p = xx直接赋值肯定不行的!
- const没有修饰p,所以指针的地址( p )可以改变,即指针的指向可以改变,最终*p也就改变了!
#includeint main() { char data = 'a'; char buf = 'b'; printf("%p \n", &data); printf("==============\n"); const char* p = &data; printf("%c \n", *p); printf("%p \n", p); printf("==============\n"); // *p = 'A'; // const修饰*p,所以不能通过解引用修改指针指向的值 p = &buf; // 但是,可以改变指针的指向 printf("%p \n", p); printf("%c \n", *p);}
010FFAB7 // 打印变量data的地址值==============a // 指针*p对应的字符的值010FFAB7 // 指针p对应的地址的值,指针p指向了data的地址==============010FFAAB // 改变指针的指向之后,指针对应的地址值b // 指针p的指向变了,所以最终的解引用的值也变了!
- 常量指针,const char* p,const修饰的是*p,说明这个指针指向的值*p不能改变。
- 虽然*p不能修改,但p可以修改,即p可以指向另一个内存空间,最终*p的值变化了。
- 注意:虽然*p的值在如上过程变化了,但是是通过改变p的指向,间接改变了*p的值,而不是直接使用*p=‘m’这种方式改了*p的值!!!
使用const修饰*p & p, 双重修饰
- 不能通过p改变指针指向
- 也不能通过*p改变指针指向地址的值
#includevoid main() { char data = 'a'; char buf = 'b'; printf("%p \n", &data); printf("==============\n"); const char * const p = &data; *p = 'A'; // 不能通过解引用方式,修改内存地址的值 p = &buf; // 也不能,修改指针的指向地址}
#includeint main() { // const char array[5] = { 'a', 'b', 'c' }; // const char, char const 是等价 char const array[5] = { 'a', 'b', 'c' }; char* p = &array; *(p + 1) = 'e'; //array[2] = 'd'; //左值指定const对象,表达式必须是可修改的左值 printf("%s \n", array);}
aec
- const 修饰的数组,不能通过数组直接修改数组中的参数
- 但是,如果指针指向了数组,可以通过指针指向的地址,通过改变内存地址的值,改变数组中元素的值!
代码中*(p + 1) ='e’解释
- 指针p指向了数组array,而指针指向的地址是数组的首元素地址,则&p代表的是首元素的地址,p+1代表的是第二个元素的地址,所以*(p+1)代表对第二个元素解引用,改变第二个元素内存地址的值。
- 如果还不是很清楚,可以参考详解:
转载地址:http://cveab.baihongyu.com/