C语言指针初识

定义指针变量

定义指针变量,在变量名前面加星号*,格式为:

                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

猜你喜欢

转载自www.cnblogs.com/ren-hang/p/10015348.html