1

基于约定 int (*o)[5]=&s; 是指针 o 指向具有 5 个元素的数组的正确方法。

我们也可以在这个语句中写 this

int (*p)[10]=s; 

但为什么更喜欢

&s at int (*o)[5]=&s; 

因为它们都返回相同的输出。

#include <stdio.h>
int main()
{
        int s[5]={10,1,2,3,4};
        int (*p)[10]=s;
        printf("%d\n",*p);
        printf("%d\n",**p);
        printf("%d\n",&s);
        
        printf("\n");

        int (*o)[5]=&s;
        printf("%d\n",*o);
        printf("%d\n",**o);
        printf("%d",&s);
    
        return 0;
}

该程序的输出是:

-593812272
10
-593812272

-593812272
10
-593812272
4

2 回答 2

2

这是无效的:

    int s[5]={10,1,2,3,4};
    int (*p)[10]=s;

因为您正在使用 type的表达式初始化一个类型的变量(指向大小为 10int (*)[10]的数组的指针) 。这些类型不兼容。intint *

虽然这很好:

    int (*o)[5]=&s;

因为初始化器的类型与变量的类型相匹配。

此外,在打印指针值时,您应该使用%p格式说明符并将参数转换为void *. 格式说明符与其关联的参数不匹配会触发未定义的行为

于 2021-10-27T15:37:39.930 回答
1

这条线

int (*p)[10]=s;

是不正确的。int *由于数组指示符隐式转换为s指向其第一个元素的指针,初始化程序具有该类型。而且左右手的两个指针不兼容。所以编译器应该发出一条消息。

这条线

int (*o)[5]=&s;

是正确的。初始化器的类型int ( * )[5]与初始化指针的类型相同o

请注意,要输出指针的值,您必须使用转换说明符%p。否则,使用转换说明符%d输出指针会调用未定义的行为。

因此,例如,而不是这些调用

printf("%d\n",*o);
//...
printf("%d",&s);

你必须写

printf("%p\n", ( void *)*o);
//...
printf("%p\n", ( void * )&s);

该表达式*o产生数组的值,该数组s又被隐式转换为指向其第一个元素的指针。

表达式的值和表达式的值*o相同&s,因为它是数组占用的内存范围的地址。但它们的类型不同。用作调用参数的第一个表达式printf具有类型int *,而第二个表达式具有类型int ( * )[5]

于 2021-10-27T16:12:12.753 回答