[C语言教程]九、指针

喜欢而已 提交于 2019-11-28 18:08:01

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:为敢(WeiGanTechnologies)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/11418333.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

一、地址与指针

Hi,欢迎来到指针的世界,也许您早已听过它的大名,指针被称为是C语言的精华所在。真正理解和掌握指针是征服C语言的关键所在!
在众多的计算机语言中,试问:还有哪门语言可以有C语言这样在作用、速度和安全上平衡的如此优异的呢?而指针则在其中扮演了重要的角色!或许有人会说:正是因为指针才使C程序变得非常不安全!而我则想说的是:这就要求C程序员要有更高的驾驭C语言的能力,而这点也恰好反映出C的设计哲学!那就是:“C充分相信程序员!” 所以:请不要辜负她!
OK,在学习指针之前,我们先弄清楚一个概念:

地址

何谓地址?在内存(注意,我们这里提到的内存并不是人们常说的计算机的物理内存,而是虚拟的逻辑内存空间)当中,简单点说:地址就是可以唯一标识某一点的一个编号,即一个数字!我们都见过尺子,我们统一以毫米为单位,一把长1000毫米的尺子,其范围区间为0~999,而我们可以准确的找到35毫米、256毫米处的位置。同样的道理,内存也如此,也是像尺子一样线性排布,只不过这个范围略大,在我们最广泛使用的32位操作系统下,是从0~4,294,967,295之间,而地址就是这之中的的一个编号而已,习惯上,在计算机里地址我们常常用其对应的十六进制数来表示,比如0x12ff7c这样。在我们的C程序中,每一个定义的变量,在内存中都占有一个内存单元,比如int类型占四个字节,char类型占一个字节等等,每个字节都在0~4,294,967,295之间都有一个对应的编号,C语言允许在程序中使用变量的地址,并可以通过地址运算符"&"得到变量的地址。

 1 #include<stdio.h>
 2 int main()
 3 {       
 4     int i;       
 5     int a[10]={1,2,3,4,5,6,7,8,9,0};       
 6     char b[10]={'c','l','a','n','g','u','a','g','e'};       
 7     for(i=0;i<10;i++)       
 8     {               
 9         printf("int Address:0x%x,Value:%d\n",&a[i],a[i]);      
10     }       
11     printf("\n");       
12     for(i=0;i<10;i++)       
13     {               
14         printf("char Address:0x%x,Value :%c\n",&b[i],b[i]);       
15     }       
16     return 0;
17 }

在32位linux系统下运行参考结果:    

 1 int Address:0xbfb949c4,Value:1
 2 int Address:0xbfb949c8,Value:2
 3 int Address:0xbfb949cc,Value:3
 4 int Address:0xbfb949d0,Value:4
 5 int Address:0xbfb949d4,Value:5
 6 int Address:0xbfb949d8,Value:6
 7 int Address:0xbfb949dc,Value:7
 8 int Address:0xbfb949e0,Value:8
 9 int Address:0xbfb949e4,Value:9
10 int Address:0xbfb949e8,Value:0
11 char Address:0xbfb949f2,Value :c
12 char Address:0xbfb949f3,Value :l
13 char Address:0xbfb949f4,Value :a
14 char Address:0xbfb949f5,Value :n
15 char Address:0xbfb949f6,Value :g
16 char Address:0xbfb949f7,Value :u
17 char Address:0xbfb949f8,Value :a
18 char Address:0xbfb949f9,Value :g
19 char Address:0xbfb949fa,Value :e
20 char Address:0xbfb949fb,Value :

二、指针的定义和使用 

指针

明白地址的概念之后,指针也就不奇怪了。简单的讲,地址就是逻辑内存上的编号,而指针虽然也表示一个编号,也是一个地址。但两者性质却不相同。一个代表了常量,另一个则是变量。就好比内存是一把尺子,而指针就是尺子上面的游标,可以左右移动,他某一个时刻是指向一个地方的,这就是指针变量。 
对指针变量定义的一般形式为: 
类型说明符 *变量名; 
其中,这里的*与前面的类型说明符共同说明这是一个指针变量,类型说明符表示该指针变量所指向的变量为何种数据类型,变量名即为定义的指针变量名。除此之外,C还提供*运算符获取地址上对应的值。 
例如:

 1 #include<stdio.h>
 2 int main()
 3 {
 4         int num=2014;
 5         int *p=&num;
 6         printf("num Address = 0x%x,num=%d\n",&num,num);
 7         printf("p = 0x%x,*p=%d\n",p,*p);
 8         printf("%d\n",*&num);
 9         return 0;
10 }

请亲自运行观察结果并思考。    

值得一提的是,由于指针存放的都是地址,在32位操作系统下都在0 ~ 4,294,967,295这个数区间内,所以:在32位操作系统下,任何类型的指针变量都占四个字节!

 1 #include<stdio.h>
 2 struct INFO
 3 {
 4         int a;
 5         char b;
 6         double c;
 7 };
 8 int main()
 9 {
10         int *p;
11         char *p1;
12         float *p2;
13         double *p3;
14         struct INFO *p4;   //struct INFO类型为结构体类型 我们将会在后面的章节中讲解
15         void *p5;
16         printf("int point size is :%d\n",sizeof(p));
17         printf("char point size is :%d\n",sizeof(p1));
18         printf("float point size is :%d\n",sizeof(p2));
19         printf("double point size is :%d\n",sizeof(p3));
20         printf("struct point size is :%d\n",sizeof(p4));
21         printf("void point size is :%d\n",sizeof(p5));
22         return 0;
23 }

三、数组与指针

 

四、字符串与指针

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!