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)多级指针

posted @ 2024-08-13 11:58  java帝国  阅读(21)  评论(0)    收藏  举报