鱼C论坛

 找回密码
 立即注册
查看: 1951|回复: 18

[已解决]关于指针数组

[复制链接]
发表于 2021-11-5 19:09:41 | 显示全部楼层 |阅读模式
8鱼币
小甲鱼在指针数组那一讲说了“应该将数组的地址传给数组指针,而不是传递数组第一个元素的地址,尽管他们的值是相同的,但含义却不一样”
那么在指向指针的指针这一讲,为什么是把array赋值给p这个数组指针,而不是&array呢?代码如下:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int array[3][4] = {
  5.                 {0, 1, 2, 3},
  6.                 {4, 5, 6, 7},
  7.                 {8, 9, 10, 11}};
  8.         int (*p)[4];
  9.         int i, j;

  10.         p = array;
  11.         for (i = 0; i < 3; i++)
  12.         {
  13.                 for (j = 0; j < 4; j++)
  14.                 {
  15.                         printf("%2d ", *(*(p+i)+j));
  16.                 }
  17.                 printf("\n");
  18.         }

  19.         return 0;
  20. }
复制代码
最佳答案
2021-11-5 19:09:42
本帖最后由 jhq999 于 2021-11-5 21:51 编辑
飞花落尽 发表于 2021-11-5 21:19
嗯,这段代码理解了,但是能不能定义char类型(只是新手的好奇)就像上面一样,我的问题主要是这个:
“ ...

  1. char *array[5] = {"FishC","Five","Star","Good","WoW"};//这不就是指针的数组,char (*array)[5];是数组的指针,不是一个类型
复制代码

最佳答案

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 19:09:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2021-11-5 21:51 编辑
飞花落尽 发表于 2021-11-5 21:19
嗯,这段代码理解了,但是能不能定义char类型(只是新手的好奇)就像上面一样,我的问题主要是这个:
“ ...

  1. char *array[5] = {"FishC","Five","Star","Good","WoW"};//这不就是指针的数组,char (*array)[5];是数组的指针,不是一个类型
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 19:25:40 | 显示全部楼层
应该将数组的地址传给数组指针,而不是传递数组第一个元素的地址,尽管他们的值是相同的,但含义却不一样
这个 含义却不一样,指的就是类型不一样
现在等于号左边的类型是 int (*)[4],等于号右边的类型也是 int (*)[4]
所以 p = array; 没问题,加了取地址符号反而类型不对了

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
飞花落尽 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 19:42:32 | 显示全部楼层
人造人 发表于 2021-11-5 19:25
应该将数组的地址传给数组指针,而不是传递数组第一个元素的地址,尽管他们的值是相同的,但含义却不一样
...

加了取地址符后array的类型是什么呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 19:48:31 | 显示全部楼层
人造人 发表于 2021-11-5 19:25
应该将数组的地址传给数组指针,而不是传递数组第一个元素的地址,尽管他们的值是相同的,但含义却不一样
...

而且其实我纠结的是前半句“应该将数组的地址传给数组指针”,那么这句话是否错了呢?是不是两边等号类型相同,就不一定要求数组的地址呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 20:15:51 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-5 20:25 编辑
飞花落尽 发表于 2021-11-5 19:48
而且其实我纠结的是前半句“应该将数组的地址传给数组指针”,那么这句话是否错了呢?是不是两边等号类型 ...

  1. int (*p)[4];//首先(*p)告诉编译器的是p是个指针,后面的[4]告诉编译器这个p是列的大小为4的二维数组的指针
复制代码


也可以这样
  1. int main()
  2. {
  3.         int array[3][4] = {
  4.                 {0, 1, 2, 3},
  5.                 {4, 5, 6, 7},
  6.                 {8, 9, 10, 11}};
  7.         int (*p)[3];
  8.         int i, j;

  9.         p = (int(*)[3])(array);
  10.         for (i = 0; i < 4; i++)
  11.         {
  12.                 for (j = 0; j < 3; j++)
  13.                 {
  14.                         printf("%2d ", *(*(p+i)+j));// printf("%2d ", p[i][j]);
  15.                 }
  16.                 printf("\n");
  17.         }

  18.         return 0;
  19. }
复制代码


还可以这样

  1. int main()
  2. {
  3.         int array[3][4] = {
  4.                 {0, 1, 2, 3},
  5.                 {4, 5, 6, 7},
  6.                 {8, 9, 10, 11}};
  7.         int *p;
  8.         int i, j;

  9.         p = (int*)(array);
  10.         for (i = 0; i < 12; i++)
  11.         {
  12.         
  13.                         printf("%2d ",*(p+i));
  14.                
  15.         }

  16.         return 0;
  17. }
复制代码


其实在内存里哪有多维数组全是一维数组;
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 20:56:19 | 显示全部楼层

那按照这个逻辑,这个程序为什么运行之后是乱码呢?(不考虑数组越界先)
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char *array[5] = {"FishC","Five","Star","Good","WoW"};//不行,因为其本身就是指针类的二维数组
  5.         char (*array1)[5] = array;
  6.         int i = 0,j;
  7.        
  8.         for (i = 0;i < 5;i++)
  9.         {
  10.                 for (j = 0;j < 5;j++)
  11.                 {
  12.                         printf("%c ",*(*(array1 + i)+ j));//取出数组的值本身就要加个*号
  13.                 }
  14.                 putchar('\n');
  15.          }
  16.        
  17.         return 0;
  18. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 21:01:14 | 显示全部楼层
本帖最后由 飞花落尽 于 2021-11-5 21:04 编辑


这样才能运行
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char *array[5] = {"FishC","Five","Star","Good","WoW"};//不行,因为其本身就是指针类的二维数组
  5.         char (*array1)[5] = *array;
  6.         int i = 0,j;
  7.        
  8.         for (i = 0;i < 5;i++)
  9.         {
  10.                 for (j = 0;j < 5;j++)
  11.                 {
  12.                         printf("%c ",*(*(array1 + i)+ j));//取出数组的值本身就要加个*号
  13.                 }
  14.                 putchar('\n');
  15.          }
  16.        
  17.         return 0;
  18. }
复制代码

字符串型数组不就相当于二维数组吗?为什么还要多解一次引用,难不成他是三维数组?(我知道他在内存中都是一维的,这里先这么称呼他先)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 21:04:04 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-5 21:09 编辑
飞花落尽 发表于 2021-11-5 20:56
那按照这个逻辑,这个程序为什么运行之后是乱码呢?(不考虑数组越界先)

  1. int main()
  2. {
  3.         char *array[5] = {"FishC","Five","Star","Good","WoW"};//这是个(char *) 类型的一维数组,里面是那些常数字符串的指针
  4.         char **array1 = array;
  5.         int i = 0,j;
  6.       
  7.         for (i = 0;i < 5;i++)
  8.         {
  9.                
  10.                         printf("%s ",*(array1 + i));//取出数组的值本身就要加个*号
  11.             
  12.                 putchar('\n');
  13.          }
  14.       
  15.         return 0;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 21:15:13 | 显示全部楼层

嗯,但是我现在想用数组指针指向他,请看这一段
  1. #include <stdio.h>

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

在定义数组指针时为什么还要多一次解引用,按照上面代码
int (*)[4] = array(array是二维数组)
char (*array1)[5] = *array(如果把字符串也当成是指针类的话,这个array也是二维数组)
那么,为什么一个要解引用,一个不用解呢?(难不成是三维,按照解引用来定义)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 21:15:59 | 显示全部楼层
  1. #include "stdafx.h"
  2. int main()
  3. {
  4.         char *array[5] = {"FishC","Five","Star","Good","WoW"};//不行,因为其本身就是指针类的二维数组
  5.         char* (*array1)[5] = &array;
  6.         int i = 0,j;
  7.       
  8.         for (i = 0;i < 5;i++)
  9.         {
  10.                 for (j = 0;*(*(*array1 + i)+ j);j++)
  11.                 {
  12.                         printf("%c ",*(*(*array1 + i)+ j));//取出数组的值本身就要加个*号
  13.                 }
  14.                 putchar('\n');
  15.          }
  16.       
  17.         return 0;
  18. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 21:19:58 | 显示全部楼层

嗯,这段代码理解了,但是能不能定义char类型(只是新手的好奇)就像上面一样,我的问题主要是这个:
“在定义数组指针时为什么还要多一次解引用,按照上面代码
int (*)[4] = array(array是二维数组)
char (*array1)[5] = *array(如果把字符串也当成是指针类的话,这个array也是二维数组)
那么,为什么一个要解引用,一个不用解呢?(难不成是三维,按照解引用来定义)”
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 21:23:47 | 显示全部楼层

就是这一段
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char *array[5] = {"FishC","Five","Star","Good","WoW"};
  5.         char (*array1)[5] = *array;
  6.         int i = 0,j;
  7.         
  8.         for (i = 0;i < 5;i++)
  9.         {
  10.                 for (j = 0;j < 5;j++)
  11.                 {
  12.                         printf("%c ",*(*(array1 + i)+ j));
  13.                 }
  14.                 putchar('\n');
  15.          }
  16.         
  17.         return 0;
  18. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 21:31:36 | 显示全部楼层

这个p和array不是一样的都是指针数组吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 21:50:01 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 22:07:08 | 显示全部楼层

诶,怎么最佳答案不见了,想问一下什么叫把他们的指针存在数组单元中,字符串不是一个数组吗?他的指针是怎么来的?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 22:12:35 | 显示全部楼层

所以说字符串是一个指针存在数组单元的东西吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 22:13:00 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-5 22:19 编辑
飞花落尽 发表于 2021-11-5 22:07
诶,怎么最佳答案不见了,想问一下什么叫把他们的指针存在数组单元中,字符串不是一个数组吗?他的指针是 ...


"FishC","Five","Star","Good","WoW"都属于字符串常量
百度:
字符串常量定义:用双引号(“”)括起来的0个或者多个字符组成的序列。
在程序中,字符串常量会生成一个“指向字符的常量指针”。当一个字符串常量出现于一个表达式中时,表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身。因此,你可以把字符串常量赋值给一个“指向字符 的指针”,例如:char *a = "123" ; a = "abc";,后者指向这些字符所存储的地址。但是,你不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符本身。例如:char a[5];a[0] = "a";就是错误的,报错结果:invalid conversion from 'const char*' to 'char'。
例如:char a[10]="love",的意思就是用字符串“love”来初始化字符数组a的内存空间,

而数组的首地址也就是“love”字符串的地址。//感觉这句话有错误
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 23:19:40 | 显示全部楼层
jhq999 发表于 2021-11-5 22:13
"FishC","Five","Star","Good","WoW"都属于字符串常量
百度:
字符串常量定义:用双引号(“”)括起来 ...

勉强懂个大概,找书看去了,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-4-25 18:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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