定义指针变量
定义指针变量,在变量名前面加星号*
,格式为:
int a;
datatype *pointname; int *p; p = &a;
或者 int a;
datatype *pointname = value; int *p = &a;
定义指针变量时必须带*
,给指针变量赋地址值时不能带*,等于一个地址即可改变指针指向
。
1 //定义普通变量 2 float a = 99.5, b = 10.6; 3 char c = ‘@‘, d = ‘#‘; 4 //定义指针变量 5 float *p1 = &a; 6 char *p2 = &c; 7 //修改指针变量的值 8 p1 = &b; 9 p2 = &d;
p1从指向&a变为指向&b,p2从指向&c变为指向&d。
通过指针变量取得数据
指针变量存储了数据的地址,通过指针变量能够获得该地址上的数据,格式为: *pointer;
这里的*
称为指针运算符,用来取得某个地址上的数据,
1 #include <stdio.h> 2 int main(){ 3 int a = 15; 4 int *p = &a; 5 printf("%d, %d\n", a, *p); //两种方式都可以输出a的值 6 return 0; 7 }
运行结果:15, 15
a的地址是0X···,p 指向 a 后,p 本身的值会变为 a的地址值0X···,*p 表示获取地址 0X··· 上的数据,也即变量 a 的值,所以 *p 变为了取数据值。
指针除了可以获取内存上的数据,也可以修改内存上的数据
1 #include <stdio.h> 2 int main(){ 3 int a = 15, b = 99, c = 222; 4 int *p = &a; //定义指针变量 5 *p = b; //通过指针变量修改内存上的数据 6 c = *p; //通过指针变量获取内存上的数据 7 printf("%d, %d, %d, %d\n", a, b, c, *p); 8 return 0; 9 }
运行结果:99, 99, 99, 99
*
在不同的场景下有不同的作用:定义指针变量时的*
和使用指针变量时的*
意义完全不同。
*
可以用在指针变量的定义中,表明这是一个指针变量,以和普通变量区分开;
使用指针变量时在前面加*
表示获取指针指向的数据,或者说表示的是指针指向的数据本身。
1 int a,b; //声明变量 2 int *p = &a; 或者 int *p; p = &a; //定义指针 3 *p = 100; //指针赋值&a的值 4 p = &b; //改变指向 5 *p = 101; //指针赋值&b的值
1 int x, y, *px = &x, *py = &y; 2 y = *px + 5; //表示把x的内容加5并赋给y,*px+5相当于(*px)+5 3 y = ++*px; //px的内容加上1之后赋给y,++*px相当于++(*px) 4 y = *px++; //相当于y=(*px)++ 5 py = px; //把一个指针的值赋给另一个指针
1 #include <stdio.h> 2 int main(){ 3 int a = 100, b = 999, temp; 4 int *pa = &a, *pb = &b; 5 printf("a=%d, b=%d\n", a, b); 6 /*****开始交换*****/ 7 temp = *pa; //将a的值先保存起来 8 *pa = *pb; //将b的值交给a 9 *pb = temp; //再将保存起来的a的值交给b 10 /*****结束交换*****/ 11 printf("a=%d, b=%d\n", a, b); 12 return 0; 13 }
运行结果:
a=100, b=999
a=999, b=100
关于 * 和 & 的谜题
假设有一个 int 类型的变量 a,pa 是指向它的指针,那么*&a
和&*pa
分别是什么意思呢?
*&a
可以理解为*(&a)
,&a
表示取变量 a 的地址(等价于 pa),*(&a)
表示取这个地址上的数据(等价于 *pa),绕来绕去,又回到了原点,*&a
仍然等价于 a。
&*pa
可以理解为&(*pa)
,*pa
表示取得 pa 指向的数据(等价于 a),&(*pa)
表示数据的地址(等价于 &a),所以&*pa
等价于 pa。
对星号*
的总结
在我们目前所学到的语法中,星号*
主要有三种用途:
- 表示乘法,例如
int a = 3, b = 5, c; c = a * b;
,这是最容易理解的。 - 表示定义一个指针变量,以和普通变量区分开,例如
int a = 100; int *p = &a;
。 - 表示获取指针指向的数据,是一种间接操作,例如
int a, b, *p = &a; *p = 100; b = *p;
。
摘自http://c.biancheng.net/cpp/html/72.html
原文地址:https://www.cnblogs.com/ren-hang/p/10015348.html