鱼C论坛

 找回密码
 立即注册
查看: 71|回复: 19

[已解决]请问这个指针数组赋值给数组指针怎么理解

[复制链接]
发表于 2021-9-15 09:10:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
  1. int main()
  2. {
  3.         char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
  4.         char *(*p)[5] = &array;
  5. }
复制代码
最佳答案
2021-9-15 09:43:54
1.  array是指针数组,里面的每一项存的内容都是一个字符串的地址,比如array[0]的内容是字符串"FishC"的首地址,(从下面代码运行结果可以看出来)
2. char *array[5] 也许写成 char* array[5] 更容易理解 类型: char*  数据结构:数组
3. char *(*p)[5] = &array 相当于   char* array[5] 的 array 用 *p替代 说明 p是指针 p的内容是数组array的首地址,(从下面代码运行结果可以看出来)

  1. #include<stdio.h>
  2. int main()
  3. {
  4.         char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
  5.         char *(*p)[5] = &array;
  6.         printf("array[0]的内容: %d\n",array[0]);
  7.     printf("array[0]指向的内容: %s\n",array[0]);
  8.         printf("array[0]的地址(与array数组的首地址): %d\n",&array[0]);
  9.         printf("p的内容(即array数组的首地址): %d\n",p);
  10.         printf("array[0]的内容: %d\n",(*p)[0]);
  11.     printf("array[0]指向的内容: %s\n",(*p)[0]);
  12.         printf("array[0]的地址(与array数组的首地址): %d\n",&(*p)[0]);
  13.                 return 0;
  14. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 09:43:54 | 显示全部楼层    本楼为最佳答案   
1.  array是指针数组,里面的每一项存的内容都是一个字符串的地址,比如array[0]的内容是字符串"FishC"的首地址,(从下面代码运行结果可以看出来)
2. char *array[5] 也许写成 char* array[5] 更容易理解 类型: char*  数据结构:数组
3. char *(*p)[5] = &array 相当于   char* array[5] 的 array 用 *p替代 说明 p是指针 p的内容是数组array的首地址,(从下面代码运行结果可以看出来)

  1. #include<stdio.h>
  2. int main()
  3. {
  4.         char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
  5.         char *(*p)[5] = &array;
  6.         printf("array[0]的内容: %d\n",array[0]);
  7.     printf("array[0]指向的内容: %s\n",array[0]);
  8.         printf("array[0]的地址(与array数组的首地址): %d\n",&array[0]);
  9.         printf("p的内容(即array数组的首地址): %d\n",p);
  10.         printf("array[0]的内容: %d\n",(*p)[0]);
  11.     printf("array[0]指向的内容: %s\n",(*p)[0]);
  12.         printf("array[0]的地址(与array数组的首地址): %d\n",&(*p)[0]);
  13.                 return 0;
  14. }
复制代码
无标题.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-9-15 10:07:47 From FishC Mobile | 显示全部楼层
jhanker 发表于 2021-9-15 09:43
1.  array是指针数组,里面的每一项存的内容都是一个字符串的地址,比如array[0]的内容是字符串"FishC"的首 ...

*p[5]本身不就是一个指向数组的指针吗,不能直接把array的数组地址直接赋值给他吗...我就不懂为什么定义时要再加一个*
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 10:35:27 | 显示全部楼层
array[0]地址,array,&array 表示的是同一个地址,但他们的含义不一样,而编译器是要检查类型是否一致的,&array[0]表示数组的第一项的地址,array编译器代表的也是第一项的地址,而&array表示整个数组五项的一起的首地址。
钱看代码
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
  5.         char *(*p)[5] = &array;
  6.         printf("array[0]的内容: %d\n",array[0]);
  7.     printf("array[0]指向的内容: %s\n",array[0]);
  8.         printf("array[0]的地址(与array数组的首地址): %d\n",&array[0]);
  9.         printf("p的内容(即array数组的首地址): %d\n",p);
  10.         printf("array[0]的内容: %d\n",(*p)[0]);
  11.     printf("array[0]指向的内容: %s\n",(*p)[0]);
  12.         printf("array[0]的地址(与array数组的首地址): %d\n",&(*p)[0]);
  13.         printf(": array第一项的地址%d,array第二项的地址%d\n", array, array+1);
  14.         printf(": array的地址%d,array数组后面的地址%d\n", &array, &array+1);
  15.                 return 0;
  16. }
复制代码

运行后看看地址的偏移量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 10:38:00 | 显示全部楼层
看看运行结果,点击图片放大后能看清楚
无标题.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-9-15 12:45:34 From FishC Mobile | 显示全部楼层
本帖最后由 黄jz 于 2021-9-15 12:47 编辑
jhanker 发表于 2021-9-15 10:35
array[0]地址,array,&array 表示的是同一个地址,但他们的含义不一样,而编译器是要检查类型是否一致的, ...


我看小甲鱼教学视频里是定义了一个数组temp然后把数组的整个数组地址赋值给了(*p)[5]=&temp,并不是*(*p)[5],我就是不明白为什么还要在前面多加一个*...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 12:56:51 | 显示全部楼层
黄jz 发表于 2021-9-15 12:45
我看小甲鱼教学视频里是定义了一个数组temp然后把数组的整个数组地址赋值给了(*p)[5]=&temp,并不是* ...

他的视频我没看过 在他视屏里 temp的类型是 char* temp[5]还是 char temp[5]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-9-15 12:59:14 From FishC Mobile | 显示全部楼层
本帖最后由 黄jz 于 2021-9-15 13:00 编辑
jhanker 发表于 2021-9-15 12:56
他的视频我没看过 在他视屏里 temp的类型是 char* temp[5]还是 char temp[5]

int temp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 13:01:22 | 显示全部楼层

所以和你问的问题是不一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-9-15 13:07:13 From FishC Mobile | 显示全部楼层
本帖最后由 黄jz 于 2021-9-15 13:09 编辑
jhanker 发表于 2021-9-15 13:01
所以和你问的问题是不一样的


他是 int temp[5],取了(*p)[5]=&temp,我想的是指针数组也是数组,为什么不能直接取数组的总体地址然后赋值给(*p)[5]而是赋值给*(*p)[5]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 13:23:49 | 显示全部楼层
黄jz 发表于 2021-9-15 13:07
他是 int temp[5],取了(*p)[5]=&temp,我想的是指针数组也是数组,为什么不能直接取数组的总体地址 ...

int temp[5];
int(*p)[5]=&temp;
这样是一边定义一边赋值是可以的
其实是
int(*p)[5];
p=&temp;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 13:24:38 | 显示全部楼层
至于书写怎么写是规定的,你要知道其中的含义就行了 !
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-9-15 13:45:51 From FishC Mobile | 显示全部楼层
jhanker 发表于 2021-9-15 13:23
int temp[5];
int(*p)[5]=&temp;
这样是一边定义一边赋值是可以的

为什么指针数组就不行...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 14:41:31 | 显示全部楼层
黄jz 发表于 2021-9-15 13:45
为什么指针数组就不行...

指针数组也可以啊
int*  temp[5];
int*(*p)[5]=&temp;
这样是一边定义一边赋值是可以的
其实是
int* (*p)[5];
p=&temp;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-9-15 15:18:27 From FishC Mobile | 显示全部楼层
jhanker 发表于 2021-9-15 14:41
指针数组也可以啊
int*  temp[5];
int*(*p)[5]=&temp;

我昨天试了一下直接报错...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 15:28:41 | 显示全部楼层
黄jz 发表于 2021-9-15 15:18
我昨天试了一下直接报错...

应该是你打错代码了,试试下面的代码:


  1. #include <stdio.h>

  2. int main()
  3. {
  4. int a=0,b=1,c=2,d=3,e=4;
  5. int* temp[5]={&a,&b,&c,&d,&e};
  6. int*(*p)[5]=&temp;
  7. int*(*pa)[5];
  8. pa=&temp;
  9. printf("a的值是:%d\n", *(*p)[0]);
  10. printf("e的值是:%d\n", *(*pa)[4]);
  11. return 0;
  12. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-9-15 16:41:23 | 显示全部楼层
jhanker 发表于 2021-9-15 15:28
应该是你打错代码了,试试下面的代码:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char *array[5]={"Fishc","Five","Star","Good","WoW"};
  5.         char (*p)[5]=&array;
  6.         int i,j;
  7.         for(i=0;i<5;i++)
  8.         {
  9.                 for(j=0;*(*(*p+i)+j)!='\0';j++)
  10.                 {
  11.                         printf("%c",*(*(*p+i)+j));
  12.                 }
  13.                 printf("\n");
  14.         }
  15.         return 0;
  16. }
复制代码




下面是错误:
C:\Users\DRD\Desktop\c\未命名41.cpp        In function 'int main()':
5        52        C:\Users\DRD\Desktop\c\未命名41.cpp        [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
5        52        C:\Users\DRD\Desktop\c\未命名41.cpp        [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
5        52        C:\Users\DRD\Desktop\c\未命名41.cpp        [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
5        52        C:\Users\DRD\Desktop\c\未命名41.cpp        [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
5        52        C:\Users\DRD\Desktop\c\未命名41.cpp        [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
6        16        C:\Users\DRD\Desktop\c\未命名41.cpp        [Error] cannot convert 'char* (*)[5]' to 'char (*)[5]' in initialization
10        22        C:\Users\DRD\Desktop\c\未命名41.cpp        [Error] invalid type argument of unary '*' (have 'int')
12        27        C:\Users\DRD\Desktop\c\未命名41.cpp        [Error] invalid type argument of unary '*' (have 'int')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 16:54:48 | 显示全部楼层
你代码写错了

  1. #include <stdio.h>

  2. int main()
  3. {

  4.         char* array[5]={"Fishc","Five","Star","Good","WoW"};
  5.         char* (*p)[5]=&array; //这一句你写错了不是  char (*p)[5]=&array;
  6.         int i,j;
  7.         for(i=0;i<5;i++)
  8.         {
  9.                         for(j=0;*(*(*p+i)+j)!='\0';j++)
  10.                         {
  11.                                 printf("%c",*(*(*p+i)+j));
  12.                         }
  13.                         printf("\n");
  14.         }
  15.         return 0;

  16. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-9-15 17:26:50 From FishC Mobile | 显示全部楼层
jhanker 发表于 2021-9-15 16:54
你代码写错了

就是为啥要多加一个*号..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-15 21:24:04 | 显示全部楼层
char* array[5]={"Fishc","Five","Star","Good","WoW"}; //这一句有 char*
char* (*p)[5]=&array; //这一句你写错了不是  char (*p)[5]=&array;//这一句也一样要求是char*
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2021-9-26 17:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表