给定`int num [7]`,`num`,`&num [0]`,`&num`如何不同?

mel*_*ony 11 c arrays pointers

我在C书中读到,对于数组来说,num[7]这个术语num相当于&num[0].这个概念对我来说很好,但是当我写下这个程序时,我再次感到困惑.

#include<stdio.h>
#include<conio.h>
int main()
{
    int num[]={21,22,23,24,25,26,27};
    int *x,*y,*z;
    x=&num;
    y=num;
    z=&num[0];
    printf("%d   %d   %d\n",sizeof(x),sizeof(y),sizeof(z));
    printf("%d  %d  %d\n",sizeof(&num),sizeof(num),sizeof(&num[0]));
    printf("%d   %d   %d",*(&num),*(num),*(&num[0]));
    getch();
    return 0;  
}
Run Code Online (Sandbox Code Playgroud)

输出是:

      4    4    4
      4    28   4
      2293536   21   21
Run Code Online (Sandbox Code Playgroud)

如果num与之相同,&num[0]为什么它们的尺寸会有所不同?这第三类术语是&num什么?我知道它显示了垃圾值,但这种类型的术语是否有意义?z=&num[0]我已经明白了.编译器显示赋值的警告x=&num,但 y=num;编译器没有任何问题.如果num有大小28那么为什么它被分配给y没有类型转换的整数指针?

然后我用这种方式尝试二维数组:

#include<stdio.h>
#include<conio.h>
int main ()
{
    int s[4][2]={{1234,56},{1235,57},{1236,58},{1237,59}};
    int i
    printf ("\n%d %d %d %d %d",sizeof(s[i]),sizeof(&s[i]),sizeof(s),
        sizeof(s[0][0]),sizeof(&s));
    getch();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在输出是

8  4  32  4   4
Run Code Online (Sandbox Code Playgroud)

sizeof(s[i])8.因为它s[i]是一个一维数组,它有两个元素所以它很好.但我不知道条款&s[i]&s意思是什么.而且我再次能够看到它s与之不完全相同s[0][0].我使用Dev C++ 4.9.9.2版本来运行所有程序.我希望在这三种术语中清楚明白.

Ray*_*oal 5

这里有好问题.希望我们都能为您解释这些问题.

特定

int num[]={21,22,23,24,25,26,27};
Run Code Online (Sandbox Code Playgroud)

然后

  • num具有类型,int[]因为它是一个声明的整数数组,其内存分配到位.需要注意的是它并没有有型int*,如果你malloced它这将一直如此.
  • sizeof(num)是28因为num是一个7个整数的数组,在你的机器上是4个字节的大小.如果整数是8个字节,则值为56;如果它们具有2个字节,则值为14,但每个整数最多4个字节.
  • &num[0]是一个类型的指针,int*是第一个元素的地址num.
  • x和朋友的大小是4,因为它们被声明为指针,在你的机器上,在你的C编译器下,指针被分配为4个字节.

要记住的是,当在某些上下文中使用数组时,比如作为参数传递,它将被转换为int*.这就是为什么你可以说*num和得到21. Tricky,但就是这样.这就是为什么人们通常可以互换num,&num[0]但你真的应该记住这个区别,因为正如你所注意到的,sizeof价值观不同.

转换是y = num有道理的原因. y有类型int*,在C中你可以从int[]TO 自动转换int*.你不能这样做x = &num因为类型&num是"指向int数组的指针".您不能将其分配给int*(指向int的指针).

如果是

int s [4] [2] = {{1234,56},{1235,57},{1236,58},{1237,59}};

我们有sas int[][]的类型,&sas pointer to int[][]的类型&s[i]和指向的类型int[](因为s[i]是一个int数组).由于C允许您为指针分配/传递数组的方式,您可以使用与第一个示例中相同类型的游戏.

您会注意到s,&s[0]并且&s[0][0]都指向相同的内存位置,但是,正如您所注意到的,sizeof值将是不同的.


Pau*_*aul 2

哇,一口气问了很多问题:P

首先,我将尝试向您解释此输出:

  4    4    4
  4    28   4
  2293536   21   21
Run Code Online (Sandbox Code Playgroud)

sizeof()是c中的一元运算符。它在代码编译时而不是运行时被整数替换。因此编译器将 printfs 更改为:

 printf("%d   %d   %d\n", 4, 4, 4);
 printf("%d  %d  %d\n", 4, 28, 4);
 printf("%d   %d   %d",*(&num),*(num),*(&num[0]));
Run Code Online (Sandbox Code Playgroud)

处于编译的早期阶段。

当您编写时,编译器会很友善地为您提供整个数组的大小sizeof(num)。这就是 sizeof 被定义为在数组上工作的方式。所有其他元素都为您提供 (int *) 的大小,但 sizeof (&num) 为您提供 (int **) 的大小(无论如何, int ** 与 int * 的大小相同)。

  • &num 是指向数组的指针的内存位置
  • num 和 &num[0] 是数组中第一个 int 的内存位置

对于你的第二个问题;

printf("\n%d %d %d %d %d",sizeof(s[i]),sizeof(&s[i]),sizeof(s),sizeof(s[0][0]),sizeof(&s));
Run Code Online (Sandbox Code Playgroud)

 

sizeof(s[i]) - size of an array (int[2]) == 8
sizeof(&s[i]) - size of a pointer to an int array sizeof(int **) == 4
sizeof(s) - size of a 2D array containing 8 ints == sizeof(int[8]) == 32
sizeof(s[0][0]) - size of an int === 4
sizeof(&s) - size of a pointer to an array == 4
Run Code Online (Sandbox Code Playgroud)