如何通透理解c语言中的**argv(*argv[])?

1 指针的底层含义

指针 = 指向地址的针 = 存放地址的地址

int i = 1;
int* p = &i;

从上面的代码可以理解:
定义了一个int型变量i,这个i是变量的名字,1是变量的值,那么变量存在的地方就是地址(假设为0xf7bc),代表一块内存,所以地址为0xf7bc的内存上存放着值1。
定义了一个int型指针p,这个p是指针的名字,&i是指针的值,同样,指针的存放也需要一块内存,当然这个指针p也有地址(假设为0xf7d2),那么它的值就是0xf7bc,所以地址为0xf7d2的内存上存放着值0xf7bc!

通过对比可以发现,好像指针和变量这两者的存在方式区别不大?
只不过指针存放的值是地址罢了。

2 函数形参中的*arg

比如在strcpy函数中,函数原型为:char *strcpy(char *dest, const char *src);
一般我们简单使用起来是这样用的:

char str[] = "hello";
strcpy(str, "world!");

有没有发现函数形参const char src是一个指针,但是我们实际传进去的是一个字符串呢?
我们知道字符串实际是以字符数组的形式存在的,我们传进去的“world!”是怎么作为指针的呢?
答案是:双引号!对,我放了双引号!
双引号做了这么几件事:申请内存,填充尾0,返回首地址。
所以直接传递字符串给函数,函数收到的其实是字符串的首地址呢!
什么?地址?那不就是指针的值嘛!所以形参
arg看似要求传入指针,实际上想要的就是一个地址嘛!
知道这个之后事情就好办了。
*argv[]需要什么呢?需要一个指针数组!
按照之前的思路,指针 = 地址。指针数组= 地址数组 = 存放了一堆地址的数组 = 存放了一堆字符串的数组 = 字符串数组!是不是通俗了许多

ok! *argv[]是存放地址的数组,数组名=首地址,那么我只要得到数组的首地址就是得到了存放地址的数组啊!
所以**argv= *argv[]!

嗷!原来c语言中的**argv(*argv[])是想要字符串数组!(字符指针数组)

所有内容仅供自己学习领悟,不代表完全正确,如有错误,感谢指正!

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值