为了账号安全,请及时绑定邮箱和手机立即绑定

数组名称是指针吗?

数组名称是指针吗?

牧羊人nacy 2019-05-21 15:54:25
数组名称是指针吗?数组的名称是C中的指针吗?如果没有,数组的名称和指针变量之间有什么区别?
查看完整描述

6 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

数组是一个数组,指针是指针,但在大多数情况下,数组名称将转换为指针。经常使用的一个术语是它们会衰减到指针。

这是一个数组:

int a[7];

a 包含七个整数的空间,你可以在其中一个中赋值赋值,如下所示:

a[3] = 9;

这是一个指针:

int *p;

p不包含任何整数空格,但它可以指向整数的空格。例如,我们可以将其设置为指向数组中的一个位置a,例如第一个:

p = &a[0];

可能令人困惑的是你也可以这样写:

p = a;

这并没有数组的内容复制a到指针p(无论这将意味着)。相反,数组名称a将转换为指向其第一个元素的指针。因此,分配与前一个分配相同。

现在您可以p以类似的方式使用数组:

p[3] = 17;

这有效的原因是C,中的数组解除引用运算符[ ]是根据指针定义的。x[y]意思是:从指针开始x,步骤y元素在指针指向的位置之后前进,然后取出那里的任何东西。使用指针算术语法,x[y]也可以写成*(x+y)

为了做到这与正常的阵列,比如我们的工作a,该名称aa[3]必须首先被转换为一个指针(在第一元件a)。然后我们向前迈出3个元素,并采取任何在那里。换句话说:将元素放在数组中的第3位。(这是数组中的第四个元素,因为第一个元素编号为0.)

因此,总之,C程序中的数组名称(在大多数情况下)转换为指针。一个例外是我们sizeof在数组上使用运算符。如果a在此上下文中转换为指针,sizeof a则会给出指针的大小而不是实际数组的大小,这将是相当无用的,因此在这种情况下a意味着数组本身。


查看完整回答
反对 回复 2019-05-21
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞


当数组用作值时,其名称表示第一个元素的地址。

当数组未用作值时,其名称表示整个数组。


int arr[7];


/* arr used as value */

foo(arr);

int x = *(arr + 1); /* same as arr[1] */


/* arr not used as value */

size_t bytes = sizeof arr;

void *q = &arr; /* void pointers are compatible with pointers to any object */


查看完整回答
反对 回复 2019-05-21
?
LEATH

TA贡献1936条经验 获得超6个赞

一个像这样声明的数组


int a[10];

分配内存10 int秒。你不能修改,a但你可以用指针算术a。


像这样的指针只为指针分配内存p:


int *p;

它没有分配任何ints。你可以修改它:


p = a;

并使用数组下标,你可以使用:


p[2] = 5;

a[2] = 5;    // same

*(p+2) = 5;  // same effect

*(a+2) = 5;  // same effect


查看完整回答
反对 回复 2019-05-21
?
繁星coding

TA贡献1797条经验 获得超4个赞

我认为这个例子揭示了这个问题:


#include <stdio.h>

int main()

{

        int a[3] = {9, 10, 11};

        int **b = &a;


        printf("a == &a: %d\n", a == b);

        return 0;

}

它在gcc 4.9.2中编译好(带有2个警告),并打印以下内容:


a == &a: 1

哎呀:-)


所以,结论是否定的,数组不是指针,它不是作为指针存储在内存中(甚至不是只读的指针),即使它看起来像是,因为你可以用&运算符获取它的地址。但是 - 哎呀 - 操作员不工作:-)),不管怎样,你都被警告过:


p.c: In function ‘main’:

pp.c:6:12: warning: initialization from incompatible pointer type

  int **b = &a;

            ^

p.c:8:28: warning: comparison of distinct pointer types lacks a cast

  printf("a == &a: %d\n", a == b);

C ++在编译时拒绝任何此类错误尝试。


编辑:


这就是我要展示的意思:


#include <stdio.h>

int main()

{

    int a[3] = {9, 10, 11};

    void *c = a;


    void *b = &a;

    void *d = &c;


    printf("a == &a: %d\n", a == b);

    printf("c == &c: %d\n", c == d);

    return 0;

}

即使c并且a“指向”相同的内存,也可以获取c指针的地址,但是无法获取a指针的地址。


查看完整回答
反对 回复 2019-05-21
  • 6 回答
  • 0 关注
  • 1174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信