写点什么

【指针】有哪些类型?

作者:Geek_65222d
  • 2022 年 10 月 10 日
    河南
  • 本文字数:1282 字

    阅读完需:约 4 分钟

字符指针

从名字可以直接看出来,字符指针是用来存放字符或者字符串的指针


在指针类型中,我们提到过 char* 类型,它就是字符指针:存放单个字符,或者存放一整个字符串的指针类型。


//存放字符的字符指针char ch = 'w';char* pc = &ch;char *pch = "abcdef";
复制代码


指针 pc 中存储了变量 ch 中‘w’字符的地址


对于第一次见到存储字符串的指针,我们首先要进行分析设问:①“abcdef”字符串是存储到了指针变量 pch 中么?(假设是在 32 位环境下)分析:在 32 位环境下,char*类型指针大小才 4 字节,而字符串“abcdef”有六个字节,明显存储不下,所以这个问题解决了。


②那存储的会是字符串的首元素‘a’的地址么?通过代码来验证:


int main(){    char *pch = "abcdef";    printf("%c\n",*pch);    return 0;}
复制代码


验证*pch 中存储的地址是否是 a


指针数组

指针数组的概念:用于存放数组地址指针


创建形式: 类型 (*name)[size]


这里一不小心特别容易写成指针数组,这就是为什么我要在这一篇再一次提起指针数组的原因,它们二者的区别请看图:


数组名

实战先再解决一个问题,概念说数组指针是存放数组地址的,那如何取得数组地址呢?是我们之前文章提及的简简单单用 arr 代表整个数组的地址么?还是用* &arr?


整一个数组地址

①sizeof(arr)其中的 arr 代表整一个数组

②&arr,可以取出整一个数组的地址

首元素地址

平常中直接写出 arr 其代表数组中首元素地址

应用

//写一个打印函数,利用数组指针打印数组中的内容int main(){    int arr[10]={1,2,3,4,5,6,7,8,9,0};    int sz = sizeof(arr)/sizeof(arr[0]);//sizeof(arr)//计算整个数组大小    my_printf(&arr,sz);//&arr,整个数组的地址,为使用数组指针做准备    return 0;}//函数主题部分----本来这部分最好是在main函数前写,为了阅读体验而做出让步void my_printf(int(*p)[10],int sz){    int i = 0;    for(i=0;i<sz;i++)    {        printf("%d ",*(*p+i));    }}
复制代码


上述代码详解:


p:指针中存储的是整个数组的地址

*p:对 p 进行解引用,得到的是 arr,而 arr 又代表数组的首元素地址

*p+i:代表数组下标为 i 的元素地址

*(*p+i):代表下标为 i 的元素


但是!这样子运用起来其实特别别扭,我本来直接传 arr 首元素的地址还更加方便的打印,为何要这么绕来绕去,所以,数组指针一般不应用在一维数组中,反言之,数组指针一般应用在二维数组中。


//写一个打印函数,利用数组指针打印二维数组中的内容int main(){    int arr[3][5]={{1,2,3,,4,5},{2,3,4,5,6},{3,4,5,6,7}};    my_printf(arr,3,5);//arr,二维元素里面第一行元素的地址    return 0;}//函数主题部分----本来这部分最好是在main函数前写,为了阅读体验而做出让步void my_printf(int(*p)[5],int c,intr)//C:行数,r:列数{    int i = 0;  for(i=0;i<3;i++)    {        int j = 0;        for(j=0;j<5;j++)        {            printf("%d ",p[i][j]);//或者是*(*(p+i)+j)    }        printf("\n");  }}
复制代码


经过上面的例子我们可以对解引用做个初步的总结:对解引用的初步总结

arr[i] == * (arr+i)

arr[i][j] == *(arr+i)[j] == * ( * (arr+i)+j )

发布于: 刚刚阅读数: 3
用户头像

Geek_65222d

关注

还未添加个人签名 2022.09.09 加入

还未添加个人简介

评论

发布
暂无评论
【指针】有哪些类型?_十月月更_Geek_65222d_InfoQ写作社区