目录
本章将学习
1字符指针
2数组指针与指针数组
3数组传参与指针传参
复习指针初阶基本知识点
1指针是个地址(编号),指针变量是存放指针的变量,但是我们平常所说的指针就是指的指针变量,指针变量的大小有4(32位平台)/8个(64位平台)字节,产生这样大小的原因是,32位平台有32根物理地址线,即一个地址是由32个0/1所组成的二进制序列所组成的,指针的不同类型决定指针加减整数时所决定的步长,还有指针解引用时访问的权限。
1:字符指针(char*)
字符指针即指向字符的地址
char ch ='w';
char* pch =&ch;
这里的pch就是字符指针
其实还有字符指针可以指向字符数组的->
char str[]="abcdef";
char* pstr =str;//这里的str是数组名,而数组名则是首元素的地址。
所以我们*pstr则打印出来的结果为a
还有另外一种
char* pp="abcdef";//这里我们应该将"abcdef"理解成常量字符串,是不能够改变的,所以pp的规范写法为
const char* pp ="abcdef";
那么我们如何来理解这个代码呢?
其实在我们内存中有一块区域叫做代码区,我们常量字符串就是存放在这个区域内的,pp就是指向这个常量字符串的地址的
接下来我们就看上面两种字符指针的区别
首先第一个字符指针是指向数组的首元素,而第二个指针是在代码区指向常量字符串的。
所以我们可以有以下的一个经典题目:
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
const char *str3 = "hello bit.";
const char *str4 = "hello bit.";
if(str1 ==str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 ==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
首先数组名都是首元素的地址
因为str1与str2是指向数组的首元素的地址的,而他们在开辟空间的时候需要分开开辟的,所以两个数组的地址是不同的,所以str1与str2are not same
str3与str4是常量字符串指针,它们都会指向代码区的字符串的地址,所以它们是相同的。
2数组指针与指针数组
首先我们需要知道数组指针与指针数组他们的本质,我们先从一个生活中的案例来描述,比如说 好孩子,这里好孩子的本质是孩子,所以数组指针的本质是指针,指针数组的本质是数组。
数组指针:是一个指针,指向数组的指针。
指针数组:是一个数组,里面存储的元素是指针类型的。
那么如何区分他们呢?
首先为了能够区分它们我们需要知道,其实[]的运算符优先级比*要高,所以一种简单的识别方式就是看在*与[]同时出现的时候我们看*是否有()来约束,如果有则一般代表是一个指针,没有则代表是一个数组。接下来通过几个代码来判断是否为指针数组与数组指针。
int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组
//这几个都是指针数组,在*前面未加()
int *p1[10];
int (*p2)[10];
//p1, p2分别是什么?
p1:p1是一个数组,数组中有10个元素,每个元素的类型是int*
p2:p2是一个指针,它所指向的类型是int [10]的数组,数组中有10个元素,每个元素是int类型的
本质上p1是指针数组,p2是数组指针
&数组名与数组名的区别
首先我们曾今就知道除了2中情况下数组名就是代表数组首元素的地址,所以数组名本质上就是一个地址,即数组名本质上是一个指针。
2中情况下就有 &数组名与sizeof(数组名)在这两种情况下都是指的是整个数组
而&数组名则代表的是取出该数组的整个地址,但是我们一般还是用首元素的地址来代表这个&数组名的值,而不同的则是&数组名在加减整数时候是跳过整个数组的地址
3数组传参与指针传参
一维数组的传参
当我们使用一维数组传参的时候,我们可以用什么类型来接收呢?
二维数组的传参的时候,当使用数组的时候需要注意数组的列是不能够省略的,二位数组传参的时候是传的一位数组的地址,所以我们可以用数组指针来接收
指针传参
当我们使用指针传参的时候我们也可以用指针来接受指针。
一 个 函 数 的 参 数 部 分 为 一 级 指 针 的 时 候 , 函 数 能 接 收 什 么 参 数 ?
数组名,传一级指针。
二级指针
我们可以传一级指针的地址,也可以传二级指针
反正无论怎么样,我们都需要具体问题具体分析,看传的是啥,则我们用啥接受。