1、普通数组指针
#include <stdio.h>
int 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
2、char* const p (指针常量)
重点:const修饰什么,什么就不能被改变!!!
- char * const p 中,const修饰的是p,所以p(指针指向的内存地址)不能改变,也就是指针常量,不能指向其他的地址了!
- 但是,指针指向的值(内存保存的值)可以改变
#include <stdio.h>
int 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的指向还是之前的地址
3、const char* p (常量指针)
重点:const修饰什么,什么就不能被改变!!!
- const 修饰的是 *p, 而*p代表解引用,代表是的某个内存地址保存的值,所以*p = xx直接赋值肯定不行的!
- const没有修饰p,所以指针的地址( p )可以改变,即指针的指向可以改变,最终*p也就改变了!
#include <stdio.h>
int 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的值!!!
4、const char * const p (常量指针常量)
使用const修饰*p & p, 双重修饰
- 不能通过p改变指针指向
- 也不能通过*p改变指针指向地址的值
#include <stdio.h>
void main() {
char data = 'a';
char buf = 'b';
printf("%p \n", &data);
printf("==============\n");
const char * const p = &data;
*p = 'A'; // 不能通过解引用方式,修改内存地址的值
p = &buf; // 也不能,修改指针的指向地址
}
5、const修饰数组
#include <stdio.h>
int 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)代表对第二个元素解引用,改变第二个元素内存地址的值。
- 如果还不是很清楚,可以参考详解:《C语言基础—15.指针&数组名&数组地址&变量对应的加减法—图解篇》