C-进阶——指针(1)

什么是指针?

1 指针就是个变量,用来存放地址,地址唯一表示一块内存空间。
2 指针的大小是固定的4/8个字节,相对应的32位/64位地址。
3 指针是有类型的,指针的类型决定了指针的+1/-1整数的步长,指针解引用操作的时候的权限。
4 指针是可以进行运算的。

指针类型

在这里插入图片描述
在上面的图片中定义pa指针
** int * **——>这是pa指针的自身类型
** int ** ——>这是pa指针所指的类型

字符指针

指向字符串首字符地址的指针

字符指针和字符数组的区别

** 两者输出大小有区别 **
在这里插入图片描述

从图中可以看出来,虽然字符数组和字符指针所打印出来的都一样,感觉两者并没有区别,但是针对于字符数组而言,它所代表的长度是后面一整串字符串的长度,而对于字符指针而言,它所代表的仅仅是指针的长度(即4个字节)。

** 两者的存储空间有区别 **
对于字符数组而言,字符数组是我们自己开辟的一个空间,可以在后面进行一系列修改删除操作,而对于字符指针而言,字符指针实际上指向的是一个系统上的一个常量空间,其并不可以被修改。

而通过了两者的存储方式的不同,可以引出下面两者的比较

int str1[] = “hello”;
int str2[] = “hello”;
int *str3 = “hello”;
int *str4 = “hello”;

那么 str1 与 str2 是否相等? str3 和 str4呢?

上面我们刚刚探讨了两者的存储方式,可以知道,str1 和 str2 其实不相等,因为针对于字符数组,是我们自己开辟的空间,两者存放的地址不同,虽然两者的内容相同的,但是把他们两只放在一起做比较的时候,实际上比较大时两者的存储地址,因为两者的存储地址不同,所以 str1 和 str2 并不相同。

str3 和 str4 虽然是两个不同的变量,但是字符指针所指向的是常量字符串,所以 str3 和 str4 是相同的。

ps:比较两者内容的函数是strcmp。

指针数组

指针数组是一个保存指针的数组
int *ar[3];

在这里插入图片描述
二级指针数组存放的是字符指针

数组指针

指向数组的指针
int (*ar)[3];

数组指针并不能接受所有数组。主要是要看我们所定义的数组指针中括号中的数字。
int (*ar)[10]; ---->说明ar所能接受的是一个空间为10的数组。 多了不行,少了也不行。

如何通过数组指针表示数组中的元素

在这里插入图片描述
如图,由图中可以看出,如果直接针对ar[0]进行打印,这时候出来的并不是数组中的第一个元素,而是这个数组的首地址。下面三行打印的代码却可以打印出数组中的元素,我们可以这样理解,将指针数组当作一个二维数组,ar[0]代表的是第一行数组的首地址,而ar[0] [0 代表的是二维数组中第一行第一列元素的值,也可以理解为:在二维数组中,首元素的地址是二维数组中第一行数组的地址,所以ar[0 代表的是一个二位数组中第一行数组的所在地址, ar[0[0 代表的是第一个数组中下标为零的值。

数组指针和指针数组的区别

在这里插入图片描述
图中可以简单的看出来,指针数组和数组指针各加一后,其增加的长度是不一样的,其中数组指针增加了整个数组的长度,即可以简单的知道,当对数组指针进行+1操作后,其增加的是一整个目前数组的长度,而指针数组增加的长度仅仅是数组元素的长度。

ps:第一次写这个,写了一下午才写出这么一点,而且内容不精,语言组织能力有点不行,如果有错,还请指正嗷。u1s1,写这个把我整头大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值