前言
大家好,我是小昭,这次分享下指针数组和数组指针应用与区别,对于C语言基础非常重要的。
目录
- 什么是指针数组?
- 什么是数组指针?
- 怎么区分指针数组和数组指针?
- 指针数组使用
- 数组指针应用
什么是指针数组?
首先,它是一个数组,这个数组里的元素存放的是指针,比如int **p[5],表示申请了5个元素大小的数组且存放的元素数据类型是int **。
什么是数组指针?
首先是 ,它是一个指针,指针指向的类型是数组类型,比如int (*p)[5],int ptr[5],
p = &ptr;
怎么区分指针数组和数组指针?
我们先看C语言运算符
int *p[10],[的优先级比**大,所以[]先和p结合,所以是数组变量;int( p)[10],()和[]优先级一样,既然一样,我们就从左往右看,*和p先结合,所以是指针。运算符优先级差别,导致变量表示意义会有差别。
补充:++i的运算符优先级是1,i++的运算符优先级是2,所以才有差异。
指针数组使用
char* p[3] = {“xiao”,“zhao”,“debug”};
**p存放“xiao”字符串的地址,**p = p[0],*(p+1)存放“zhao”字符串的地址,*(p+1)=p[1]。
打印字符串
int len = sizeof(p)/8;//64位系统环境。一个指针占8个字节。
for(int i = 0;i < len;i++)
printf("%s ",p[i]);
假如说,我想读取第三个字符串中第二个字符怎么访问,也就是“debug”中的e,怎么去读?
我们可以进行类比,
假如char str[] = “debug”, 那么str是地址, str[1]=*(str+1),就可以访问到第二字符。
char* p[3] = {“xiao”,“zhao”,“debug”}; 那么“debug”地址就是p[2]或者*(p+2),类似上面一样操作。
p[2][1]或者*(* (p+2)+1),将p[2]和*(p+2)互换,可以是*(p[2]+1)或者(*(p+2))[1],一共四种表达方式。
抛出一个疑问,sizeof§ = ?
我们都知道指针数组是数组,既然是数组,就要知道数组有多少元素,一个元素占多大空间,OK,概念清晰就可以计算,有三个元素,元素的类型是指针,指针的大小是4个字节(32位机),所以sizeof§ = 12。
是否能修改“debug”字符串中的‘e’字符?
将‘e’改成‘A’,p[2][1] = “A”。先说结论,这样操作是非法的,不允许这样操作。
因为这部分的字符串是存储在只读存储区,就是字符常量区,只允许被读取。
数组指针应用场景
linux终端命令传参
#include <stdio.h>
int main(int argc, char** argv)// char** argv 约等于 char* argv[]
{
if (argc < 2)
{
printf("please input arguments.\n");
return -1;
}
for (int i = 1; i < argc; i++)
printf("%s ", argv[i]);
printf("\n");
return 1;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-exQMYUFq-1652171305939)(image/image_XI6Pm8DuK1.png)]
数组指针应用
指针指向数组:
char str[] = "hello";
char *ptr = str;
数组指针,指向数组整体类型(char [4])的指针,等价于存放的是数组的地址:
char (*p)[4];
char str[4];p = &str;
数组指针指向二维数组:
int main(int argc, char** argv)
{
char buf[3][4] = {"123","456","789"};
char (*p)[4];//数组指针p,指针步长4个char,即4位。
int i=0;
p = buf;
while(i<3)
{
//printf("%c ",(*p)[i]);//指针没有变,步长是1
printf("%c ",(*p++)[0]);//指针每加1,位移4个长度
i++;
}
return 0;
}
以上是个人总结,有疑问随时欢迎联系我,我是 小昭debug。
|