指针数组和数组指针

前言

大家好,我是小昭,这次分享下指针数组和数组指针应用与区别,对于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。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小昭dedug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值