指针与数组的复杂纠葛

网友投稿 624 2022-11-16

指针与数组的复杂纠葛

指针与数组的复杂纠葛

三: 指针与数组的复杂纠葛

1:指针与数组

指针可以配合数组干点什么事情呢? 我们定义的指针变量可以存放地址,那就可以存放数组的地址啊!

(1)指向一维数组

一个简单的运用

#include#includeint main(){ char str[] = "I love you"; char *target = str; int count = 0; while (*target++ !='\0') { count++; /* code */ // printf("%d",count); } printf("the total is :%d",count); system("pause");}

就拿这一个说明

我们这边的target指针是指向数组的,明白了说也就是数组的首地址,就是字符I的首地址,初始化是这样,当我们给指针进行++的时候就会依次指向第二个以至于往后。取*号就是取地址处的值,ok,说明白了。

根本还有要理解指针是怎样指向的,以及怎样指向数组,这样就不会被反复套娃。

(2)指向二维数组

你看指向二维数组,我们这边形象化一下,你再理解一下数组名代表了什么?

打印输出数组名就会得到数组的首地址,也就是第一个元素的值。

要想搞清楚,那就打印验证

#include#includeint main(){ int array[2][3] = {0}; for(int i =0;i<2;i++){ for(int j=0;j<3;j++){ scanf("%d",&array[i][j]); } } printf("size of int is %d\n",sizeof(int)); printf("the add of array pointed is %d\n",array);//我们这边按照十进制将地址打印出来,是整个数组的首地址 printf("the value of *array pointed is %d\n",*array);//可以认为取到嵌套的一维数组的地址 printf("the value of **array is %d\n",**array);//可以认为取到存放一维数组的值 printf("the value of *(array+1) pointed is %d\n",*(array+1)); printf("the add of array+1 pointed is %d\n",array+1); system("pause"); /* 输出打印后通过分析可得,array是指向五个包含元素的数组的指针 */}/*如何理解二维数组呢?二维数组根本还是在内存中按照一维数组存放的。可以认为是嵌套。*/

写不动了,就不再举例了。我们来看搞脑子的有趣的知识点。

2:指针数组

你可能不怎么用,我承认对大一的同学们可能就离谱。什么?还有这玩意?

必要的时候没图就理解不了啊!小甲鱼的图图,我带来了。

为什么这就是一个指针数组呢?而不是数组指针?

[]的优先级别高于*,所以先结合p后结合*。

指针数组是一个数组,每个数组元素存放一个指针变量

可以干啥?可以这样做

#include#includeint main(){ //下面这个是指针数组 char *p1[5] = { "every one can dream!", "i think i can successful", "dont care it ,just do it for your dream", "how are you", "believe yourself"}; for (int i =0;i<5;i++){ printf("%s\n",p1[i]); } system("pause");}

你可能产生一种不可理解的意识,那就是字符串怎么能赋值给指针呢。但是并不是这个意思。

3:数组指针

继续套娃

那么数组指针是什么?

可以看到p和*加了括号,所以会优先结合

数组指针就是指向数组的指针

来一段简单的代码

//下面演示数组指针,指向数组的指针,不要认为其指向地址,而是指向整个数组#include#includeint main() { int temp[] ={1,2,3,4,5}; int (*p2)[5] = &temp; int i; for(i =0;i<5;i++) { printf("%d\n",*(*p2+i)); } system("pause");}

问题来了,既然p2是指针,那么*p就·代表了取值,为什么要取 * 呢?

p2是指向整个数组,我们可以这样理解,进行一层 * 可以认为其取到数组第一个元素的首地址,再次*可认为取值。ok。

四:给你一些相关的内容以及遇到的问题

套娃 给几个代码

/*使用指针的方法将最大值保存到变量a中去,最小值保存到变量b中去*/#include void ff(int *p1, int *p2) {//把实参的地址内容传递过去赋值的过程 int a;//和main函数中的a不一样的 a = *p1;//将p1地址上的值传给a;// printf("%d", &a); *p1 = *p2; *p2 = a;}int main() { int a, b; int *p_1, *p_2; //定义指针型变量指向int类型的变量 scanf("%d %d", &a, &b); p_1 = &a; //将地址附值给p_1,p_2; p_2 = &b; printf("%d,%d\n", &a, &b); if (a < b) { ff(p_1, p_2); } printf("最大值为%d,最小值为%d", a, b); return 0;}

#include#includeint main(){ //初始化两个指针开始指向空 int *p1 =NULL; int *p2 =NULL; int *p3 =NULL; int a =6,b =8,c =10; p1 =&a;//代表p1指针指向a的地址 p2 =&b; p3 =&c; //你可以先打印*p1/*p2代表了什么,其实这次再取*的话,和指针定义的*不一样,代表取取指针指向地址处的内容 // eg: printf("the value of a is %d\n",*p1); printf("the address of a is %p\n",p1);//打印地址直接就%p //交换值可以取值直接交换 // eg: *p1 = *p2; printf("this time ,the value of a is %d\n",a); //?试试地址交换? p1 = p3; printf("the value of a is %d\n",a);//打印输出你只会发现值交换才是有效的,用指针只是指针的指向发生了改变 printf("the value of pointer p1 is %d",*p1); system("pause");}

#include#includeint main(){ int array[2][3] = {0}; for(int i =0;i<2;i++){ for(int j=0;j<3;j++){ scanf("%d",&array[i][j]); } } printf("size of int is %d\n",sizeof(int)); printf("the add of array pointed is %d\n",array);//我们这边按照十进制将地址打印出来,是整个数组的首地址 printf("the value of *array pointed is %d\n",*array);//可以认为取到嵌套的一维数组的地址 printf("the value of **array is %d\n",**array);//可以认为取到存放一维数组的值 printf("the value of *(array+1) pointed is %d\n",*(array+1)); printf("the add of array+1 pointed is %d\n",array+1); system("pause"); /* 输出打印后通过分析可得,array是指向五个包含元素的数组的指针 */}/*如何理解二维数组呢?二维数组根本还是在内存中按照一维数组存放的。可以认为是嵌套。*/

#include#include//指针数组int main(){ char *cBooks[] = { "Cease to struggle and you cease to live", "Time ca heal a broken heart,but it can also break a waiting heart", "the fox changes his skin but not his habbits", "Time is but a river flowing from our past" }; char **jgdabc; char **jgdabc_loves[4]; jgdabc_loves[0] = &cBooks[0]; jgdabc_loves[1] = &cBooks[1]; jgdabc_loves[2] = &cBooks[2]; jgdabc_loves[3] = &cBooks[3]; printf("%d\n",jgdabc_loves[0]); printf("%d\n",*jgdabc_loves); printf("%s\n",*jgdabc_loves[0]); printf("%c\n",**jgdabc_loves[0]); printf("%c\n",**jgdabc_loves[1]); system("pause");}

这边请自行运行并思考,专注指针的要点,以及指向指针的·指针的含义。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【一键安装+Docker】无视系统,十几个ROS版本任你选择
下一篇:SAP 电商云 Spartacus UI SiteContext Selector 的设计明细讲解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~