今天学习了指针,指针吧理解有点小难,慢慢分析就懂。
在开始学指针之前先回顾一下C语言的数据类型如下图所示:
按照分类分别为:
1->基础数据类型:char ;short; int; long; float; double。
2->构造类数据类型:数组;指针;结构体;共用体;枚举;
一 指针
接下来开始介绍指针:
指针:仅仅是一种数据类型该数据类型专门用来存放地址;
1.1指针的定义:
格式:数据类型 *变量名
数据类型:指针指向的空间的数据类型;
指针里面存放谁的地址,就称为指针指向谁。
也就可以理解为:指针指向的空间的数据类型 *变量名
举例说明:
int num;
int *p =#
首先定义一个整形变量名为num,整形变量的存在计算机会为它开空间,而这个空间就是用来存储这个整形变量的地址。所以可以解释为:p里面用来存放num的地址,然后被叫为p指向num。
那么其中的各个部分对应是什么东西了?
其中:int*p
p的数据类型为:int*,为什么p的数据类型是int*而不是int了?
因为判断一变量的数据类型的规则是去掉变量名剩下的全都是它的数据类型。
而其中的int:是指p所指向的空间数据类型。在这里也就是前面定义的整形num。
1.2指针的大小
指针的大小为:固定8字节
比如:
int *p; char *p;double *p,这三个指针的大小是多少了?
用代码验证一下:
#include<stdio.h>
int main()
{int num =100;int *p =#double Num=0;double *q=&Num;char ann='a';char *w =&ann;printf("%d\n",sizeof(p));printf("%d\n",sizeof(q));printf("%d\n",sizeof(w));return 0;}
运行结果:
由此可见不论定义什么类型的指针,其数据类型固定位八个字节。
1.3指针的用法
①一般用法
int num =100;
int *p = #
②int *p = NULL; //NULL 是 0 号地址;
#include<stdio.h>
int main()
{int num =100;int *p =#printf("%d\n",num);printf("%d\n",*p);printf("%p\n",p);return 0;}
运行结果
插入:&号
怎么理解了?
比如:
int num; char ch; int *p;
&num: int* &ch:char* &p:int **
简明的理解为:使用&后,对应的数据类型加一个 *
注意:只能对变量取地址;如果对常量进行取地址就会报错。
1.4 解指针
格式:*变量名;
解释:通过地址,操作指针指向的空间;
比如:
int num=200;
int *p=#
printf("%d",*p);
p 里面存放 num 的地址, 叫做 p 指向 num, 则*p 就是得到 num 的空间.如上图说标注。
1.5 野指针
int*p; //局部变量--p里面存的是随机数
注意:虽然*p = 200; //不报错! ! 但是不能做! !(避免出现野指针)
1.6指针的偏移
指针的加减:指针的加减以指针指向的空间大小为单位
int num=100; num+=1; num=101;
int *p=NULL; p++; p=Ox4
char*q=NULL q++; q=Ox1
代码验证:
#include<stdio.h>
int main()
{int num =100;int *p=NULL;char *q=NULL;num +=1;printf("%d\n",num);p++;printf("%d\n",p);q++;printf("%d\n",q);return 0;}
运行结果:
使用10进制的输出:
使用%p查看16位的地址
为什么会这样了?
可以看到第一个是整形变量在有具体值之后使用变量偏移就是直接加减。第二个同样是整形,而对于指针来说,其是以指向的空间大小为单位,我的理解就是在处理指针偏移时,处理的是一位属于类型,也就比如说是处理int型数据的指针,移动一场,就是对应的数据类型的位数,比如int型,是四个字节,移动一次就是移动了四个字节,char是一个字节,所以移动后的数是1.
二 二级指针
指针定义:指针指向的空间类型 * 变量名;
一般方法:
int num=100;
int *p = #//这是一级指针
int **q = &p;q二级指针
怎么理解这三行了。
翻译过来就是,定义了一个整形变量名为num,然后定义了一个指针指向它,用来存储它的地址,那么也就是说指针p也是有地址的,有地址就可以继续存储,定义了一个二级指针,用来存储一级指针的地址。这就是二级指正,那么三级,四级,,,皆是如此。
#include<stdio.h>
int main()
{int num =100;int *p=#int **q = &p;//打印num的值printf("num=%d\n",num);printf("*p=%d\n",*p);printf("**q=%d\n",**q);/*这三个值是相同的,因为*p存储的是num的地址,**q存储的是*p的值,所以这三个值相同*/ //打印p的值printf("&num=%p\n",&num);printf("p=%p\n",p);printf("**q=%p\n",*q);//打印q的值printf("q=%p\n",q); printf("&p=%p\n",&p);return 0;}
运行结果;
由上面的代码和输出结果不难看出:num的地址信息是存储在*p中,*p放在**q中。而单独的p是存储的地址。
指针偏移: 以指针指向的空间大小为单位偏移(二级指针, 指向的空间均为指
针, 因此二级指针的指针偏移统统以 8 为单位)
int **p = NULL; char **a = NULL;
p++; a++;
0x8 0x8
二级指针的偏移和一级指针有所不同,一级指针作用于指向的数据类型,以指向的数据类型为单位,进行偏移,而二维指针指向的是上一个一级指针,而指针的数据类型固定是八位,所以为以后的值为8.
好了今天的笔记到此介绍,已经分享一张我喜欢的图片吧。