1. 指针的重要性:
表示一些复杂的数据结构 (学数据结构必须学指针)
快速的传递数据
使函数返回一个以上的值
能后方便的处理字符串
是理解面向对象语言中的基础 (java)
总结: 指针是 c 语言的灵魂
2. 指针的定义
(1) 地址
内存单元的编号
从零开始的非负整数
范围: 4G(0-4G-1)
控制线: 控制数据传输的方向
数据线: 进行数据传输
地址线: 用来确定对内存条的哪个单元进行控制 (有 32 个地址总线, 一个地址线能控制 2 个内存单元, 32 个地址线能控制 2^32 个内存单元)
(2) 指针
指针就是地址, 地址就是指针
指针变量就是存放单元编号的变量, 或者说指针变量就是存放地址的变量
指针和指针变量时两个不同的概念
注意: 通常我叙述时会把指针变量简称为指针, 实际上他们是不同的概念
指针的本质就是一个操作受限的非负整数 (指针只能相减)
(3) 指针的分类
1. 基本类型指针
- int * p;//p 是变量的名字,(int *) 表示 p 变量存放的是 int 类型变量的地址
- //int * p; 不表示定义了一个名字叫做 * p 的变量
- // 所谓 int * 类型实际就是存放 int 变量地址的类型
- int i = 3;
- p = &i; // p 保存了 i 的地址, 因此 p 指向 i
- *p= i ; //*p 就是 i
指针常见错误
常见错误一:
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int * p; //p 是局部变量, 若不初始化, 则为垃圾值
- int i = 5;
- *p = i;// 错误, p 应该先指向一个地址, p 变量里面是一个垃圾值, 不知道 * p 里面的内容, 但是把 i=5 修改了一个不属于你的单元
- printf("%d\n", *p);
- return 0;
- }
常见错误二:
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int i = 5;
- int * p;
- int * q;
- p = &i;
- //*q = p; // 错误, int 不能向 int * 转换
- //*q = *p; //error, 因为 q 没有赋值, q 是一个垃圾值,*q 是一个不属于你能控制的单元
- p = q; //q 是垃圾值, q 赋给 p,p 也变成垃圾值
- printf("%d\n",*q);
- /*
- q 的空间是属于本程序的, 所以本程序可以读写 q 的内容
- 但是如果 q 内部是垃圾值, 则本程序不能读写 * q 的内容
- 因为 * q 所代表的内存单元的控制权限并没有分配给本程序
- 所以本程序运行到 14 行就会立即出错
- */
- return 0;
- }
互换两个数字
- #include <stdio.h>
- #include <stdlib.h>
- void exchange_1(int ,int );
- void exchange_2(int * ,int *);
- void exchange_3(int * ,int *);
- int main()
- {
- int a = 3;
- int b = 5;
- exchange_3(&a,&b); //exchange_2(*p,*q); 是错误的, exchange_2(a,b); 是错误的
- printf("a = %d, b = %d\n",a,b);
- }
- // 不能完成互换功能
- void exchange(int a, int b)
- {
- int t;
- t = a;
- a = b;
- b = t;
- return ;
- }
- // 不能完成互换功能
- void exchange_2(int * p,int * q)// 形参名字是 p,q 接收实参数据的是 p 和 q
- {
- int * t; // 如果要互换 p 和 q 的值, 则 t 必须是 int * 类型, 不能是 int 类型, 否则会出错
- t = p;
- p = q;
- q = t;
- }
- // 可以完成互换的功能
- void exchange_3(int * p,int * q)
- {
- int t; // 如果要互换 * p 和 * q 的值, 则 t 必须定义成 int, 不能定义 int *, 否则会出错
- t = *p; //p 是 int *, *p 是 int(*p 代表以 p 地址为整型的变量)
- *p = *q;
- *q = t;
- }
附注:
* 的含义
1. 乘法
2. 定义指针变量
int * p; // 定义了一个名叫 p 的变量, int * 表示 p 只能存放 int 变量的地址
3. 指针运算符
该运算符放在已经定义好的指针变量的前面
如果 p 是已经定义好的指针变量, 则 *p 表示 以 p 的内容为地址的变量
例: int * p; // 定义一个 p 的指针变量
*p = 5;
如何通过被调函数修改主调函数普通变量的值
1. 实参必须为该普通变量的地址
2. 形参必须为指针变量
3. 在被调函数中通过
* 形参名 = .......
的方式就可以修改主调函数相关变量的值
- #include <stdio.h>
- #include <stdlib.h>
- void exchange_3(int * ,int * );
- void exchange_3(int * p,int * q)
- {
- int t;
- t = *p;
- *p = *q;
- *q = t;
- return ;
- }
- int main()
- {
- int a = 3;
- int b = 5;
- exchange_3(&a,&b);
- printf("a = %d, b = %d",a,b);
- return 0;
- }
指针 - 2
来源: http://www.bubuko.com/infodetail-3093965.html