鱼C论坛

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

[已解决]关于指针数组

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

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

        p = array;
        for (i = 0; i < 3; i++)
        {
                for (j = 0; j < 4; j++)
                {
                        printf("%2d ", *(*(p+i)+j));
                }
                printf("\n");
        }

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

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

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

 char *array[5] = {"FishC","Five","Star","Good","WoW"};//这不就是指针的数组,char (*array)[5];是数组的指针,不是一个类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

加了取地址符后array的类型是什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

而且其实我纠结的是前半句“应该将数组的地址传给数组指针”,那么这句话是否错了呢?是不是两边等号类型相同,就不一定要求数组的地址呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

        p = (int(*)[3])(array);
        for (i = 0; i < 4; i++)
        {
                for (j = 0; j < 3; j++)
                {
                        printf("%2d ", *(*(p+i)+j));// printf("%2d ", p[i][j]);
                }
                printf("\n");
        }

        return 0;
}

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

        p = (int*)(array);
        for (i = 0; i < 12; i++)
        {
        
                        printf("%2d ",*(p+i));
               
        }

        return 0;
}

其实在内存里哪有多维数组全是一维数组;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

int main()
{
        char *array[5] = {"FishC","Five","Star","Good","WoW"};//不行,因为其本身就是指针类的二维数组 
        char (*array1)[5] = array;
        int i = 0,j;
        
        for (i = 0;i < 5;i++)
        {
                for (j = 0;j < 5;j++)
                {
                        printf("%c ",*(*(array1 + i)+ j));//取出数组的值本身就要加个*号 
                }
                putchar('\n');
         } 
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


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

int main()
{
        char *array[5] = {"FishC","Five","Star","Good","WoW"};//不行,因为其本身就是指针类的二维数组 
        char (*array1)[5] = *array;
        int i = 0,j;
        
        for (i = 0;i < 5;i++)
        {
                for (j = 0;j < 5;j++)
                {
                        printf("%c ",*(*(array1 + i)+ j));//取出数组的值本身就要加个*号 
                }
                putchar('\n');
         } 
        
        return 0;
}
字符串型数组不就相当于二维数组吗?为什么还要多解一次引用,难不成他是三维数组?(我知道他在内存中都是一维的,这里先这么称呼他先)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

int main()
{
        char *array[5] = {"FishC","Five","Star","Good","WoW"};//这是个(char *) 类型的一维数组,里面是那些常数字符串的指针
        char **array1 = array;
        int i = 0,j;
       
        for (i = 0;i < 5;i++)
        {
                
                        printf("%s ",*(array1 + i));//取出数组的值本身就要加个*号
            
                putchar('\n');
         }
       
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

int main()
{
        char *array[5] = {"FishC","Five","Star","Good","WoW"}; 
        char (*array1)[5] = *array;
        int i = 0,j;
        
        for (i = 0;i < 5;i++)
        {
                for (j = 0;j < 5;j++)
                {
                        printf("%c ",*(*(array1 + i)+ j)); 
                }
                putchar('\n');
         } 
        
        return 0;
}
在定义数组指针时为什么还要多一次解引用,按照上面代码
int (*)[4] = array(array是二维数组)
char (*array1)[5] = *array(如果把字符串也当成是指针类的话,这个array也是二维数组)
那么,为什么一个要解引用,一个不用解呢?(难不成是三维,按照解引用来定义)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-5 21:15:59 | 显示全部楼层
#include "stdafx.h"
int main()
{
        char *array[5] = {"FishC","Five","Star","Good","WoW"};//不行,因为其本身就是指针类的二维数组
        char* (*array1)[5] = &array;
        int i = 0,j;
       
        for (i = 0;i < 5;i++)
        {
                for (j = 0;*(*(*array1 + i)+ j);j++)
                {
                        printf("%c ",*(*(*array1 + i)+ j));//取出数组的值本身就要加个*号
                }
                putchar('\n');
         }
       
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

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

int main()
{
        char *array[5] = {"FishC","Five","Star","Good","WoW"}; 
        char (*array1)[5] = *array;
        int i = 0,j;
        
        for (i = 0;i < 5;i++)
        {
                for (j = 0;j < 5;j++)
                {
                        printf("%c ",*(*(array1 + i)+ j)); 
                }
                putchar('\n');
         } 
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

这个p和array不是一样的都是指针数组吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-5 21:50:01 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

诶,怎么最佳答案不见了,想问一下什么叫把他们的指针存在数组单元中,字符串不是一个数组吗?他的指针是怎么来的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

所以说字符串是一个指针存在数组单元的东西吗?
想知道小甲鱼最近在做啥?请访问 -> 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”字符串的地址。//感觉这句话有错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

勉强懂个大概,找书看去了,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 21:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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