初识C语言之指针入门1
Posted zsQgqdsd1002
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识C语言之指针入门1相关的知识,希望对你有一定的参考价值。
什么是指针?
指针其实就是一个变量,不过其特殊的地方在于只能存储地址。
如:
#include<stdio.h>
int main() {
int a = 1;
int* p = &a;
printf("%d\\n", *p);
return 0;
}
此时p就是一个指针,它里面存储的是变量a的地址,在printf()函数中的*为间接访问符,*p则叫做间接访问。
那么直接访问和间接访问的区别在哪里?直接访问是直接通过定义的变量名来访问变量的数值,间接访问则是通过访问指针里存储的内容达到访问变量的目的。
举个例子:你的好兄弟a在209宿舍,直接访问就是你直接去209宿舍找他,间接访问则是你去了208宿舍,208宿舍里有张横幅,上面写着"a在209"。你通过这个横幅的内容到了209宿舍找到了a。
所以,因为*p存储着a的地址,我们就可以说*p是指向a的,当然是逻辑上的指向,不是真的用手指着a,我们把*p叫做指针,而p则是指针变量。
那么接下来,我们能不能再定义一个指针,使新的指针指向p的地址呢?试着添加一下
#include<stdio.h>
int main() {
int a = 1;
int* p = &a;
int** p2 = &p;
printf("%d\\n", *p2);
return 0;
}
这个时候printf()会输出什么呢?结果是输出了p的地址号。那我这个时候说能不能给**p2赋a的地址呢?答案是否定的,因为**p2是一个二级指针,而*p是一个一级指针,一级指针可以存变量地址,到了二级指针,就只可以存指针的地址了,这是需要注意的。那么我这个指针存的是p的地址,而p又存入了a的地址,为什么输出的结果不是a呢?这里就还是一个间接访问的问题,前面说过*为间接访问符,问题就在于一个*只可以间接访问一次,也就是只能进行一次间接访问操作。在这种情况下,第一次间接访问访问到的是p的地址,不能一次访问到a。那么要输出a的值要怎么做呢?很简答,只需要变一句就行了
printf("%d\\n",**p2);
既然一个间接访问符只能间接访问一次,那么我间接访问两次不就行了(狗头),第一次二级指针访问到了一级指针p的地址,第二次根据p的地址的访问到a就可以了。以此类推,就算是一个10级指针,那么你是几级我就间接访问多少次就可以了。
那我此时给**p2赋值会怎么样,比如说我让**p2=10;会对*p和a造成什么影响吗?
#include<stdio.h>
int main() {
int a = 1;
int* p = &a;
int** p2 = &p;
**p2 = 10;
printf("%d\\n", *p);
printf("%d\\n",a);
return 0;
}
运行程序我们会发现,两个printf()函数输出的结果都是10。这也很很好理解的,**p2已经是间接访问到了a,即就是a的内存,并且把10这个值赋给了这块内存,所以此时打印a和*p的值都是10.
这个问题讨论完了,还有一个问题,就是我这个指针,他所占的空间大小是多少,与定义指针时的类型又有什么关系?写出下面这个函数来计算一下
#include<stdio.h>
int main() {
printf("%d\\n",sizeof(char*));
printf("%d\\n",sizeof(int*));
printf("%d\\n",sizeof(short*));
printf("%d\\n",sizeof(long*));
printf("%d\\n", sizeof(long long*));
printf("%d\\n", sizeof(float*));
printf("%d\\n", sizeof(double*));
printf("%d\\n", sizeof(long double*));
return 0;
}
令人吃惊的是,得出的结果都是4,那也就是说明指针所占的存储空间是和其类型没有任何关系的,这又是为什么呢?就32位操作系统来说,前面说过指针所存储的内容是地址号,那么在32位操作系统中,地址号都为32位,所以存储所需要的空间也一定都是32/8=4个字节。结论就是,不管什么样的指针,在32位操作系统中都只占4个字节,这一点也是需要注意的。
以上就是我对指针入门的了解,如果有错误的,需要改正的或是补充的地方,可以直接指出来,我会加以完善修改的。
以上是关于初识C语言之指针入门1的主要内容,如果未能解决你的问题,请参考以下文章
初识C语言,教你读懂C语言,理清C语言脉络,真正入门C语言(函数数组操作符常见关键字#define定义常量和宏指针和结构体等相关内容)