13.指针深入学习_A【郝斌C语言入门学习】
1.指针的定义
地址:内存单元的编号,从零开始的非负整数。

范围:0 -- 4G-1
1KB = 210B
1MB = 210KB = 220B
1GB = 210MB = 220KB = 230B
32位:232B = 222KB = 212MB = 22GB = 4GB
指针:指针就是地址,地址就是指针
指针变量就是存放内存单元编号的变量,或者指针变量存放地址的变量
指针和指针变量是两个不同概念
但是要注意:通常我们叙述时会把指针变量简称指针,实际它们的含义不一样
指针的本质就是一个操作受限的非负整数(只能做减法运算,不能做加法运算)
2.指针的分类
(1)基本类型指针
例题1:
1 # include <stdio.h> 2 int main(void) 3 { 4 int * p;//p是变量的名字,int * 是数据类型,int * 表示p变量存放的是int类型变量的地址 5 //注意:int * p;不表示定义了一个名字叫做*p的变量 6 //int * p;应该这样理解:p是变量名,p变量的数据类型是 int *类型,所谓int * 类型实际就是存放int变量地址的类型 7 int i = 3; 8 int j; 9 p = &i;//&取地址符 10 printf("%d\n", i); 11 printf("%p\n", p); 12 printf("%d\n", *p); 13 /* 14 1.p保存了i的地址,因此p指向i 15 2.p不是i,i也不是p,更准确地说,修改p的值不会影响i的值,修改i的值不会影响p的值。 16 3.如果一个指针变量指向了某个普通变量,则 17 *指针变量 就完全等同于 普通变量 18 例子: 19 如果p是个指针变量,并且p存放了普通变量i的地址, 20 则p指向了普通变量i,*p 就完全等同于 i 21 或者说:在所有出现*p的地方都可以替换成i,在所有出现i的地方都可以替换成*p 22 *p就是以p的内容为地址的变量 23 */ 24 j = *p;//相当于 j = i; 25 printf("i = %d, j = %d\n", i, j); 26 return 0; 27 } 28 /* 29 在vc++6.0中的输出结果:3 30 0061FF24 31 3 32 i = 3, j = 3 33 */
例题2:
1 # include <stdio.h> 2 int main(void) 3 { 4 int * p; 5 int i = 5; 6 *p = i;//*p代表以p的内容为地址的变量,将变量i值赋给p指向的未知内存空间。程序不会出错,*p是int类型,i是int类型。 7 printf("%d\n", *p); 8 9 return 0; 10 }
例题3:指针的常见错误
1 # include <stdio.h> 2 int main(void) 3 { 4 int i = 5; 5 int* p; 6 int* q; 7 p = &i; 8 //*q = p;//语法编译错误。*q是int类型,p是int *类型。 9 //*q = *p;//错误 10 p = q;//q是垃圾值,q赋给p,p也变成垃圾值 11 printf("%d\n", *q); 12 /* 13 q空间是属于本程序的,所以本程序可以读写q的内容。 14 但是如果q的内部为垃圾值,则本程序不能读写*q的内容。因为*q所代表的内存单元的控制权并没有分配给本程序。 15 */ 16 return 0; 17 } 18 /* 19 在vc++6.0中的输出结果: 20 */
例题4:经典题两数互换
方法一:不能完成互换功能
1 # include <stdio.h> 2 void exchange_1(int a, int b) 3 { 4 int t; 5 t = a; 6 a = b; 7 b = t; 8 } 9 int main(void) 10 { 11 int a = 3; 12 int b = 5; 13 exchange_1(a, b); 14 printf("a = %d, b = %d\n", a, b); 15 return 0; 16 } 17 /* 18 在vc++6.0中的输出结果:a = 3, b = 5 19 */
方法二:不能完成互换功能
1 # include <stdio.h> 2 void exchange_2(int * p, int * q) 3 { 4 int * t;// 如果要互换p和q的值,则t必须是int *,不能是int,否则会出错 5 t = p; 6 p = q; 7 q = t; 8 9 } 10 int main(void) 11 { 12 int a = 3; 13 int b = 5; 14 exchange_2(&a, &b); 15 printf("a = %d, b = %d\n", a, b); 16 return 0; 17 } 18 /* 19 在vc++6.0中的输出结果:a = 3, b = 5 20 */
方法三:能完成互换功能
1 # include <stdio.h> 2 void exchange_3(int * p, int * q) 3 { 4 int t; 5 t = *p; 6 *p = *q; 7 *q = t; 8 } 9 int main(void) 10 { 11 int a = 3; 12 int b = 5; 13 exchange_3(&a, &b); 14 printf("a = %d, b = %d\n", a, b); 15 return 0; 16 } 17 /* 18 在vc++6.0中的输出结果:a = 5, b = 3 19 */
附注:*的含义
A.乘法
B.定义指针变量。int * p;//定义了一个名字叫p的变量,int *表示p只能存放int变量的地址
C.指针运算符:该运算符放在已经定义好的指针变量的前面
如果p是一个定义好的指针变量,则*p表示以p的内容为地址的变量
(2)指针和数组
(3)指针和函数
(4)指针和结构体
(5)多级指针

浙公网安备 33010602011771号