目录
- 1. 初识指针
- 1.1 什么是指针
- 1.2 指针变量和普通变量的区别
- 1.3 指针的符号
- 1.4 指针使用3步骤:定义、赋值、解引用
- 1.5 指针定义的同时进行初始化与先定义后赋值的区别
- 1.6 常量指针
- 1.7 指针变量类型和存储目标变量的类型要一致。
- 1.8 定义注意事项
- 2. 指针的作用
1.1 什么是指针
指针是个变量,这个变量存储的是其他变量在内存中的地址。
1.2 指针变量和普通变量的区别
都是变量,没有本质区别。
1.3 指针的符号
& 取地址符。取它后面跟着的变量在内存中的地址。
* 指针符。在指针中*有2个用法,一个是定义指针,一个是解引用。
1.4 指针使用3步骤:定义、关联、解引用
int a = 0;
int *p; //定义
p = &a; //关联 p指针变量名,代表指针本身。
printf("*p = %d \n", *p); //解引用 *p代表p指向的那个对象,这里指a
1.5 指针定义的同时进行初始化与先定义后赋值的区别
(1)定义的同时进行初始化
int a = 0;
int *p = &a;
(2)先定义完成后赋值
int a = 0;
int *p = NULL; //这里用NULL,是为了避免野指针
p = &a; //*p = &a; 是错误的
1.6 常量指针
区分当前表达式const对哪个起作用的方法:要看const的右边离的最近的是* 还是指针变量名。
(1) 如果是*,则代表指针指向的那个变量的值是常量,不可修改。如以下2个表达式,const右边都是*,效果是一样的,写法不同而已。
int a = 0;
const int * p1 = &a ; //表达式1
int const * p2 = &a; //表达式2
*p1 = 3; //错误的,不可修改 编译器:error: assignment of read-only location ‘*p1’
*p2 = 6; //错误的,不可修改 编译器:error: assignment of read-only location ‘*p2’
(2) 如果const的右边最近的是指针变量名,则代表指针本身储存的地址不可修改,指针一开始指向的是啥就是啥,以后都不能变。
int a = 0, b = 0;
int * const p;
p = &b; // 错误,不可修改。 编译器: error: assignment of read-only variable ‘p’
(3) 2个const
const int * const p; //指针本身不可修改,指向的变量的值也不可修改。
1.7 指针变量类型和存储目标变量的类型要一致。
如:int a = 0; //int 类型
int *p = &a; // int *类型,表示指向的那个变量的类型是int类型
printf("result=%d \n", *p);
char a[10]="hello";
char *p = a;
printf("result=%s \n", p); //这里不用*p,字符串直接用指针变量名。
1.8 定义注意事项
同时定义多个变量时,*号只对前面这个变量起作用。
如:char *a = "A", b ='B'; //分开写:char *a = "A"; char b='A';
char *a = "A", *b = "B"; //分开写:char *a; char *b ="A";
2. 指针的作用
经典例子:互换A、B 两个变量的值
void exchange(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
printf("a = %d b = %d \n", a, b); //运行结果:a = 2 b = 1
}
int main(void)
{
int a = 1;
int b = 2;
exchange(a, b);
printf("a = %d b = %d \n", a, b); //运行结果:a = 1 b = 2
return 0;
}
通过运行结果可知,exchange函数中a、b的值确实对换了,但是在main中再打印时,却还是对换前的值。
main中的exchange函数的调用,其实只是把a、b复制了一个副本并传入exchange函数,函数中只是对这个副本进行了操作,与原本的a、b无关。所以在main中打印出a、b的值还是原来的。
如果想真的修改a、b的值,就得使用指针的方式:
void exchange(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
printf("a = %d b = %d \n", *a, *b); //运行结果:a = 2 b = 1
}
int main(void)
{
int a = 1;
int b = 2;
exchange(&a, &b);
printf("a = %d b = %d \n", a, b); //运行结果:a = 2 b = 1
return 0;
}