鱼C论坛

 找回密码
 立即注册
查看: 2893|回复: 28

[已解决]数组名与数组第一个元素地址还有数组的地址的区别

[复制链接]
发表于 2021-9-26 23:46:46 | 显示全部楼层 |阅读模式
10鱼币
1.这三个意义都是指什么?
2.定义一个一维数组 array[5]={1,2,3,4,5};
                           int (*P)[5]=&array;
从数组指针的赋值是不是可以看出数组名array加上&就表示数组的地址呢?
那么数组名只是与数组首元素的地址在数值上相等,它的意义又是什么呢?
3.定义一个二位数组 temp[4][5];
视频里说二位数组的数组名temp可以理解为指向包含五个元素的数组的指针,把二维数组temp当成一个包含四个元素的一维数组,这四个元素每一个又可以当成是包含五个元素的一维数组,
那么temp[0]是不是可以当成temp[0][0]~temp[0][4]的数组名呢?
数组名temp指向的是不是temp[0]这一维度的数组还是指向这一维度数组的首元素temp[0][0]?
最佳答案
2021-9-26 23:46:47
bszs 发表于 2021-9-27 21:19
图片上的代码和输出我全明白,我看了数组指针和指针与二维数组后一直迷糊数组名,数组指针赋值给指针的是 ...
数组名是数组第 0 个元素的地址
C语言中没有二维数组,没有三维数组,没有多维数组
C语言中的是 数组中存储数组,为了方便才称之为 二维数组,三维数组,四维数组,。。。
int a[3];         // a 是一个数组,有 3 个元素,每一个元素的类型都是 int
char b[4][2]   // b 是一个数组,有 4 个元素,每一个元素的类型都是 一个数组
                    // 这个数组有 2 个元素,每一个元素的类型都是 char

是数组的数组
数组中存储的是数组
为了方便才称之为 二维数组,实际是 数组中存储数组

数组名是数组第 0 个元素的地址
a 就是 &a[0]
b 就是 &b[0]
b[0] 就是 &b[0][0]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-26 23:46:47 | 显示全部楼层    本楼为最佳答案   
bszs 发表于 2021-9-27 21:19
图片上的代码和输出我全明白,我看了数组指针和指针与二维数组后一直迷糊数组名,数组指针赋值给指针的是 ...
数组名是数组第 0 个元素的地址
C语言中没有二维数组,没有三维数组,没有多维数组
C语言中的是 数组中存储数组,为了方便才称之为 二维数组,三维数组,四维数组,。。。
int a[3];         // a 是一个数组,有 3 个元素,每一个元素的类型都是 int
char b[4][2]   // b 是一个数组,有 4 个元素,每一个元素的类型都是 一个数组
                    // 这个数组有 2 个元素,每一个元素的类型都是 char

是数组的数组
数组中存储的是数组
为了方便才称之为 二维数组,实际是 数组中存储数组

数组名是数组第 0 个元素的地址
a 就是 &a[0]
b 就是 &b[0]
b[0] 就是 &b[0][0]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-26 23:48:19 | 显示全部楼层
这个地方挺迷糊的,主要还是不理解数组名与数组首元素还有数组的地址的区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-26 23:59:36 | 显示全部楼层
刚好,之前回答的两个问题,综合起来就是你这个问题的答案
https://fishc.com.cn/thread-203000-1-1.html
https://fishc.com.cn/thread-202679-1-1.html


                               
登录/注册后可看大图

第 2 个从 27 楼开始看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 00:00:17 | 显示全部楼层
https://fishc.com.cn/thread-203000-1-1.html
#include <stdio.h>
int main(void) {
    int array[] = {1, 2, 3};
    int (*p)[] = &array;
    printf("%p\n", p);
    printf("%p\n", &array);
    printf("%p\n", *p);
    printf("%p\n", *&array);
    printf("%p\n", array);
    printf("%p\n", &array[0]);

    int (*a)[];
    a = p;
    a = &array;
    printf("%p\n", a);

    int *b;
    b = *p;
    b = *&array;
    b = array;
    b = &array[0];
    printf("%p\n", b);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 00:02:10 | 显示全部楼层
地址的值一样,但是类型不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 00:17:33 | 显示全部楼层
1.png
#include <stdio.h>

int main() {
    long long a[4][4] = {
        {123, 456, 789, -1},
        {223, 556, 889, -2},
        {323, 656, 989, -3},
        {423, 756, 189, -4}
    };
    long long **x = (long long **)a;
    long long (*y)[4][4] = &a;
    printf("%p\n", x);
    printf("%p\n", y);

    printf("%p\n", x[0]);
    printf("%p\n", (*y)[0]);
    printf("%lld\n", (long long)x[0]);
    printf("%lld\n", (long long)(*y)[0]);

    //printf("%lld\n", x[0][0]);    // 报错
    printf("%lld\n", (*y)[0][0]);
    return 0;
}

/*
$ ./main
0xffffcb90
0xffffcb90
0x7b
0xffffcb90
123
4294953872
123
$ 

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

使用道具 举报

 楼主| 发表于 2021-9-27 00:20:11 | 显示全部楼层
人造人 发表于 2021-9-27 00:02
地址的值一样,但是类型不同

c++看不懂~~~~
数组首元素地址和数组的地址好理解,但数组名是具体指啥啊?
把一个二维数组每行都当成一个一维数组来看,一行的第一个元素是否可以当成这个一维数组的数组名呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 00:22:18 | 显示全部楼层
变量的类型决定了如何操作这个变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 00:28:00 | 显示全部楼层
bszs 发表于 2021-9-27 00:20
c++看不懂~~~~
数组首元素地址和数组的地址好理解,但数组名是具体指啥啊?
把一个二维数组 ...

第 2 个从 27 楼开始看
基本上没有使用多少 C++ 的东西

数组名就是数组第 0 个元素的地址
&a[0][0]

把一个二维数组每行都当成一个一维数组来看,一行的第一个元素是否可以当成这个一维数组的数组名呢?
我认为是对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-27 00:29:49 | 显示全部楼层
人造人 发表于 2021-9-27 00:02
地址的值一样,但是类型不同

看到那个指针与二维数组的时候,二维数组array[4][5]的数组名array当成了指向五个元素的数组的指针,就想着,这不是数组指针吗?数组指针赋值的是整个数组的地址,那么这个二维数组名array是不是也存放着第一行·的地址?或者把这一行当成包含五个元素的一维数组array[0],那就是array指针存放着整个数组array[0]的地址?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 00:39:30 | 显示全部楼层
bszs 发表于 2021-9-27 00:29
看到那个指针与二维数组的时候,二维数组array[4][5]的数组名array当成了指向五个元素的数组的指针,就想 ...

你先看一看我写的那些内容,还有前面两个帖子的内容
看看能理解多少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 04:33:55 | 显示全部楼层
如图:
数组的访问和指针差不多,
int array[5]{1,2,3,4,5}
int* p=array;

这就说明了array就是数组的指针,所以数组的访问方式是[指针+下标],下标就是偏移,距离是[类型*下标]
同样,反汇编里数组的访问方式也用到了ptr,
至于有什么意义,如果你不加下标,谁知道你是个数组?

二维数组,
图下面,也是一个道理,
int temp[4][5]

指针就是temp,指向的位置是temp[0],
然后在吧temp[0]当做一个指针,指向它的头部,也就是temp[0][0],打个括号可能会更容易理解 (temp[0]) [0]
第一个下标里面是元素的头部
第二个下标里面是元素的元素数量
所以下标1+1,偏移=(类型*下标2)

你甚至可以这样理解tmep就是一个p[4*5]
int* p=temp;
p[0]就是temp[0][0]
p[5]就是temp[1][0]
p[6]就是tmep[1][1]

p[10]就是temp[2][0]
p[11]就是temp[2][1]
M)5CZ3`F$7CLBQFIYBJO~JF.png
V)%S5XZ[Q@]4`4[G@UY@7RH.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-27 16:37:40 | 显示全部楼层
2736946915 发表于 2021-9-27 04:33
如图:
数组的访问和指针差不多,
int array[5]{1,2,3,4,5}

也就是说二维数组数组名可以当成指针但是和数组指针不一样,数组指针指向的是整个数组,存放的是数组的地址,而二维数组存放的是数组每行首元素的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 18:21:05 | 显示全部楼层
bszs 发表于 2021-9-27 16:37
也就是说二维数组数组名可以当成指针但是和数组指针不一样,数组指针指向的是整个数组,存放的是数组的地 ...

是的,你可以把它当成指针,但是后面说错了,数组指针和数组名指向的地址都是一样的,本质相同;
数组指针和数组名指向的都是它头部,也就是数组第一个元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-27 19:03:26 | 显示全部楼层
2736946915 发表于 2021-9-27 18:21
是的,你可以把它当成指针,但是后面说错了,数组指针和数组名指向的地址都是一样的,本质相同;
数组指 ...

但是数组指针那一节里说的是数组指针指向的是数组的地址,而数组的地址、数组名和数组首元素的地址值相同性质不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-27 20:46:52 | 显示全部楼层
人造人 发表于 2021-9-27 00:39
你先看一看我写的那些内容,还有前面两个帖子的内容
看看能理解多少

二维数组数组名可以当成指针但是和数组指针不一样,数组指针指向的是整个数组,存放的是数组的地址,而二维数组存放的是数组每行首元素的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-27 20:47:36 | 显示全部楼层
人造人 发表于 2021-9-27 00:39
你先看一看我写的那些内容,还有前面两个帖子的内容
看看能理解多少

我这样理解还吗?两个大佬都教不会我,我吐了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 21:04:41 | 显示全部楼层
bszs 发表于 2021-9-27 20:47
我这样理解还吗?两个大佬都教不会我,我吐了

我写了那么多(还有那个两个帖子的内容),你看懂了多少?
你目前哪里不明白?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-27 21:08:05 | 显示全部楼层
bszs 发表于 2021-9-27 19:03
但是数组指针那一节里说的是数组指针指向的是数组的地址,而数组的地址、数组名和数组首元素的地址值相同 ...

这个就得看你是怎么理解的了,简单理解可以区分,因为怕刚开始学习,把数组和指针弄混淆,
区别就在于:
指针能单独使用,你现在指的这个数组,我不想指它了,我指向另一个数组,也可以
数组名不行,它必须得配合下标,它不能像指针一样想指哪里就指哪里,局限很大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 12:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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