鱼C论坛

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

[已解决]关于数组指针

[复制链接]
发表于 2019-4-29 20:11:12 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 YiMingC 于 2019-4-29 21:29 编辑

问题一:
        对于:
                 int (*p2)[5] = &temp;
       
        为什么是对地址再取址...难道地址还有专门的地址来储存吗...        
        不太清楚这里是应该把temp当作单纯的数组名来看还是数组名的值来看...
#include <stdio.h>

int main()
{
        int temp[5] = {1, 2, 3, 4, 5};
        int (*p2)[5] = &temp;
        int i;

        for (i = 0; i < 5; i++)
        {
                printf("%d\n", *(*p2 + i));
        }

        return 0;
}




问题二:

代码如下:
第5行的 “char *(*p)[5] = &array;” 这段声明看不太懂,这是什么?数组指针吗...?p又是什么...

#include <stdio.h>
int main()
{
        char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
        char *(*p)[5] = &array;
        int i, j;

        for (i = 0; i < 5; i++)
        {
                for (j = 0; (*p)[i][j] != '\0'; j++)
                {
                        printf("%c ", (*p)[i][j]);
                }
                printf("\n");
        }

        return 0;
}


问题三:

课后作业的一段原文:
argv(第二个形参)必须是指向字符指针的指针(注意:它不是指针数组,但你可以理解为指向一个字符指针数组名或字符串数组

我的问题在于:       
                        既然argv不是指针数组,
                        那为什么可以理解为指向一个字符串数组,这前后不矛盾吗?

问题比较多,麻烦大家了!
最佳答案
2019-4-29 20:11:13
“char *(*p)[5] = &array;”
p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指针,每一个指针都指向一个char
或者
p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指针,都是char *
^_^

最佳答案

查看完整内容

“char *(*p)[5] = &array;” p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指针,每一个指针都指向一个char 或者 p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指针,都是char * ^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-29 20:11:13 | 显示全部楼层    本楼为最佳答案   
“char *(*p)[5] = &array;”
p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指针,每一个指针都指向一个char
或者
p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指针,都是char *
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-29 21:45:28 | 显示全部楼层
问题一:
数组的名字相当于数组第0个元素的地址
也就是说,如果有
int data[10];
那么,data就是&data[0]
这两个的数值相等,类型也相等,都是int *

&data
是整个数组的地址,数值上和data、&data[0]相等
但是类型却不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-29 21:49:56 | 显示全部楼层
好吧 data的名字的类型是int [10],不过int [10]和int *兼容,可以直接赋值
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-29 21:51:34 | 显示全部楼层
&data的类型是int (*)[10]
2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-29 21:52:51 | 显示全部楼层
意思是&data是一个指针,这个指针指向一个数组,这个数组有10个元素,每一个元素的类型都是int
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-29 21:58:08 | 显示全部楼层
data
&data[0]
&data
他们在数值上都相等,但是类型不一样
int *和 int [10]的类型兼容,可以直接赋值,可以理解为data和&data[0]是一样的
3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-29 22:02:33 | 显示全部楼层
类型不一样,体现在对这个值进行运算的时候
4.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-29 22:07:26 | 显示全部楼层
data是3930308,data+1是3930312,加了4
&data[0]是3930308,&data[0]+1是3930312,加了4
&data是3930308,&data+1是3930348,加了40
一个int和一个int *都是4个字节
40意味着有10个元素,一个元素4个字节

&data是整个数组的地址
data是数组第0个元素的地址,类型和值都和&data[0]一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-29 22:13:24 | 显示全部楼层
第1个问题就到这里,有哪里不明白就继续问,下面说第2个问题

第2个问题就简单了(对于我来说^_^)
C语言复杂声明解析
https://blog.csdn.net/wangweixaut061/article/details/6549768

文章有点长,看完这篇文章,理解了文章的内容,那你就不存在第2个问题了,是这一类的问题全部不存在了^_^

第3个问题先放一放,先弄明白前两个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-30 08:33:26 From FishC Mobile | 显示全部楼层
人造人 发表于 2019-4-29 22:16
“char *(*p)[5] = &array;”
p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指 ...

有个地方不太理解...
char  *(*p)[5]=&array
这里声明时等号左侧,不管是*还是[]都只是一种标志,只是告诉编译器p是什么,并不进行实际运算操作(*并不取p的值),但等号右侧的&是真的进行了取址操作,所以不管左侧怎样写最后右侧地址都是赋给p,而*[]这些符号只是改变p的类型,是这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-30 09:11:30 From FishC Mobile | 显示全部楼层
本帖最后由 YiMingC 于 2019-4-30 09:48 编辑
人造人 发表于 2019-4-29 22:16
“char *(*p)[5] = &array;”
p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指 ...


麻烦看一下问题二中的代码

按我理解:
这里第五行的p是一个指向元素都是指向字符型的指针的数组的指针,在第十二行输出的时候先对p取值,得到的应该是 每个元素都是指向字符型的指针的数组 ,经过下标索引之后相当于解引用,返回字符作为输出。
可以这样理解吗...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-30 11:26:57 | 显示全部楼层
YiMingC 发表于 2019-4-30 08:33
有个地方不太理解...
char  *(*p)[5]=&array
这里声明时等号左侧,不管是*还是[]都只是一种标志, ...

嗯,char  *(*p)[5]的类型和&array的类型一样,这样才能赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-30 11:29:58 | 显示全部楼层
YiMingC 发表于 2019-4-30 09:11
麻烦看一下问题二中的代码

按我理解:


“p是一个指向元素都是指向字符型的指针的数组的指针”
这样的描述好吗?

那么请问
“p是一个指向元素都是指向字符型的指针的数组的指针的指针的指针的数组”是什么?
不要用这种描述


“char *(*p)[5] = &array;”
p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指针,每一个指针都指向一个char
或者
p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指针,都是char *

C语言复杂声明解析
https://blog.csdn.net/wangweixaut061/article/details/6549768
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-30 11:33:48 | 显示全部楼层
void (*signal(int, void(*)(int)))(int);
试用你的那种方式描述这个
signal是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-30 11:40:36 | 显示全部楼层
signal是一个函数,这个函数有两个参数和一个返回值
第1个参数是int
第2个参数是一个指针,这个指针指向函数,指向的这个函数有一个int类型的参数,返回值是void

上面说了signal的两个参数,下面看看signal的返回值
signal返回一个指针,返回的这个指针指向函数,指向的这个函数有一个int类型的参数和void返回值

用你的方法描述这个signal,然后对比一下看看哪个更容易理解

C语言复杂声明解析(真的很重要)
https://blog.csdn.net/wangweixaut061/article/details/6549768
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-30 13:25:28 | 显示全部楼层
人造人 发表于 2019-4-30 11:40
signal是一个函数,这个函数有两个参数和一个返回值
第1个参数是int
第2个参数是一个指针,这个指针指向 ...

您发的那个帖子我已经阅读过了...
我刚刚的那种描述方式是出自这里...

对过于复杂的声明用这个描述确实可能有点混乱,
但是可以只看最后一个“的”的后面来确定它是指针还是数组什么的...

您那种描述方法我确实可以接受,
但是对于不是过于复杂的声明文章中给出的这种方式的递进关系个人感觉更一目了然...
感觉像是您那种的简化版...可以翻译过去
123.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-30 13:35:09 | 显示全部楼层
人造人 发表于 2019-4-29 20:11
“char *(*p)[5] = &array;”
p是一个指针,这个指针指向一个数组,这个数组有5个元素,每一个元素都是指 ...

基本上都理解了,谢谢啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-30 15:04:55 | 显示全部楼层
YiMingC 发表于 2019-4-30 13:25
您发的那个帖子我已经阅读过了...
我刚刚的那种描述方式是出自这里...

我记得我的这种方式是在这里学的,我看了一下,确实不是这里,我已经不记得是在哪了
不用纠结这类问题,很快的学完一遍C,然后开始学汇编语言,之后带着汇编语言再学一遍C,这一次就是专门去纠结这类问题的
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-30 15:30:19 | 显示全部楼层
人造人 发表于 2019-4-30 15:04
我记得我的这种方式是在这里学的,我看了一下,确实不是这里,我已经不记得是在哪了
不用纠结这类问题, ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 03:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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