bszs 发表于 2021-9-26 23:46:46

数组名与数组第一个元素地址还有数组的地址的区别

1.这三个意义都是指什么?
2.定义一个一维数组 array={1,2,3,4,5};
                           int (*P)=&array;
从数组指针的赋值是不是可以看出数组名array加上&就表示数组的地址呢?
那么数组名只是与数组首元素的地址在数值上相等,它的意义又是什么呢?
3.定义一个二位数组 temp;
视频里说二位数组的数组名temp可以理解为指向包含五个元素的数组的指针,把二维数组temp当成一个包含四个元素的一维数组,这四个元素每一个又可以当成是包含五个元素的一维数组,
那么temp是不是可以当成temp~temp的数组名呢?
数组名temp指向的是不是temp这一维度的数组还是指向这一维度数组的首元素temp?

人造人 发表于 2021-9-26 23:46:47

bszs 发表于 2021-9-27 21:19
图片上的代码和输出我全明白,我看了数组指针和指针与二维数组后一直迷糊数组名,数组指针赋值给指针的是 ...

数组名是数组第 0 个元素的地址
C语言中没有二维数组,没有三维数组,没有多维数组
C语言中的是 数组中存储数组,为了方便才称之为 二维数组,三维数组,四维数组,。。。
int a;         // a 是一个数组,有 3 个元素,每一个元素的类型都是 int
char b   // b 是一个数组,有 4 个元素,每一个元素的类型都是 一个数组
                  // 这个数组有 2 个元素,每一个元素的类型都是 char

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

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

bszs 发表于 2021-9-26 23:48:19

这个地方挺迷糊的,主要还是不理解数组名与数组首元素还有数组的地址的区别

人造人 发表于 2021-9-26 23:59:36

刚好,之前回答的两个问题,综合起来就是你这个问题的答案
https://fishc.com.cn/thread-203000-1-1.html
https://fishc.com.cn/thread-202679-1-1.html

https://xxx.ilovefishc.com/forum/202109/26/233652vei7ff787mppqg8f.png
第 2 个从 27 楼开始看

人造人 发表于 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);

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

    int *b;
    b = *p;
    b = *&array;
    b = array;
    b = &array;
    printf("%p\n", b);
    return 0;
}

人造人 发表于 2021-9-27 00:02:10

地址的值一样,但是类型不同

人造人 发表于 2021-9-27 00:17:33


#include <stdio.h>

int main() {
    long long a = {
      {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) = &a;
    printf("%p\n", x);
    printf("%p\n", y);

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

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

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

*/

bszs 发表于 2021-9-27 00:20:11

人造人 发表于 2021-9-27 00:02
地址的值一样,但是类型不同

{:10_269:}c++看不懂~~~~
数组首元素地址和数组的地址好理解,但数组名是具体指啥啊?
把一个二维数组每行都当成一个一维数组来看,一行的第一个元素是否可以当成这个一维数组的数组名呢?

人造人 发表于 2021-9-27 00:22:18

变量的类型决定了如何操作这个变量

人造人 发表于 2021-9-27 00:28:00

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

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

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

把一个二维数组每行都当成一个一维数组来看,一行的第一个元素是否可以当成这个一维数组的数组名呢?
我认为是对的

bszs 发表于 2021-9-27 00:29:49

人造人 发表于 2021-9-27 00:02
地址的值一样,但是类型不同

看到那个指针与二维数组的时候,二维数组array的数组名array当成了指向五个元素的数组的指针,就想着,这不是数组指针吗?数组指针赋值的是整个数组的地址,那么这个二维数组名array是不是也存放着第一行·的地址?或者把这一行当成包含五个元素的一维数组array,那就是array指针存放着整个数组array的地址?

人造人 发表于 2021-9-27 00:39:30

bszs 发表于 2021-9-27 00:29
看到那个指针与二维数组的时候,二维数组array的数组名array当成了指向五个元素的数组的指针,就想 ...

你先看一看我写的那些内容,还有前面两个帖子的内容
看看能理解多少

2736946915 发表于 2021-9-27 04:33:55

如图:
数组的访问和指针差不多,
int array{1,2,3,4,5}
int* p=array;

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

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

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

你甚至可以这样理解tmep就是一个p
int* p=temp;
p就是temp
p就是temp
p就是tmep

p就是temp
p就是temp

bszs 发表于 2021-9-27 16:37:40

2736946915 发表于 2021-9-27 04:33
如图:
数组的访问和指针差不多,
int array{1,2,3,4,5}


也就是说二维数组数组名可以当成指针但是和数组指针不一样,数组指针指向的是整个数组,存放的是数组的地址,而二维数组存放的是数组每行首元素的地址

2736946915 发表于 2021-9-27 18:21:05

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

是的,你可以把它当成指针,但是后面说错了,数组指针和数组名指向的地址都是一样的,本质相同;
数组指针和数组名指向的都是它头部,也就是数组第一个元素

bszs 发表于 2021-9-27 19:03:26

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

但是数组指针那一节里说的是数组指针指向的是数组的地址,而数组的地址、数组名和数组首元素的地址值相同性质不同

bszs 发表于 2021-9-27 20:46:52

人造人 发表于 2021-9-27 00:39
你先看一看我写的那些内容,还有前面两个帖子的内容
看看能理解多少

二维数组数组名可以当成指针但是和数组指针不一样,数组指针指向的是整个数组,存放的是数组的地址,而二维数组存放的是数组每行首元素的地址

bszs 发表于 2021-9-27 20:47:36

人造人 发表于 2021-9-27 00:39
你先看一看我写的那些内容,还有前面两个帖子的内容
看看能理解多少

我这样理解还吗?两个大佬都教不会我,我吐了{:10_282:}

人造人 发表于 2021-9-27 21:04:41

bszs 发表于 2021-9-27 20:47
我这样理解还吗?两个大佬都教不会我,我吐了

我写了那么多(还有那个两个帖子的内容),你看懂了多少?
你目前哪里不明白?

2736946915 发表于 2021-9-27 21:08:05

bszs 发表于 2021-9-27 19:03
但是数组指针那一节里说的是数组指针指向的是数组的地址,而数组的地址、数组名和数组首元素的地址值相同 ...

这个就得看你是怎么理解的了,简单理解可以区分,因为怕刚开始学习,把数组和指针弄混淆,
区别就在于:
指针能单独使用,你现在指的这个数组,我不想指它了,我指向另一个数组,也可以
数组名不行,它必须得配合下标,它不能像指针一样想指哪里就指哪里,局限很大
页: [1] 2
查看完整版本: 数组名与数组第一个元素地址还有数组的地址的区别