如果int数组变量返回int数组第一个元素的地址,那么为什么char数组变量不返回第一个元素的地址?

5sxhfpxr  于 2023-01-25  发布在  其他
关注(0)|答案(2)|浏览(188)

Here, i attached code image如何处理字符数组?
如果图像不清晰,则参考此代码

#include <stdio.h>

int main() {
    char c[3] = {'s', 'a', 'h'};
    int a[3] = {1, 2, 3};
    printf("%c\n", c);
    printf("%d\n", a);
    return 0;
}

我尝试了这个代码,但没有得到预期的结果。可能是我错误的期望,但想知道为什么会发生。

tzxcd3kk

tzxcd3kk1#

在此代码片段中

char c[3] = {'s', 'a', 'h'};
int a[3] = {1, 2, 3};
printf("%c\n", c);
printf("%d\n", a);

printf调用中使用的数组指示符ca被隐式转换为指向其第一个char *int *类型元素的指针。

printf("%c\n", &c[0]);
printf("%d\n", &a[0]);

来自C标准(6.3.2.1 L值、数组和函数指示符)
3除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,**类型为"类型数组"的表达式将转换为类型为"类型指针"的表达式,该表达式指向数组对象的初始元素,并且不是左值。**如果数组对象具有寄存器存储类,则该行为未定义。
但是转换说明符cd相应地期望charint类型的对象。
你得写下来

printf("%c\n", *c);
printf("%d\n", *a);

这和

printf("%c\n", c[0]);
printf("%d\n", a[0]);

如果你想输出数组的第一个元素的地址(即整个数组的地址的相同值),你需要使用转换说明符p

printf("%p\n", ( void * )c);
printf("%p\n", ( void * )a);

如果你想把地址输出为整数,你需要包含头文件<inttypes.h><stdint.h>(最后一个已经包含在第一个头文件中),将指针转换为intptr_t或uintptr_t类型,并使用适当的宏。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main( void )
{
    char c[] = { 's', 'a', 'h' };
    int  a[] = { 1, 2, 3 };

    printf( "address of c is %p\n", ( void * )c );
    printf( "address of c as integer is %" PRIuPTR "\n", ( uintptr_t )c );
    printf( "address of a is %p\n", ( void * )a );
    printf( "address of a as integer is %" PRIuPTR "\n", ( uintptr_t )a );
}

程序输出可能如下所示

address of c is 00C4F8FC
address of c as integer is 12908796
address of a is 00C4F8E8
address of a as integer is 12908776
a0x5cqrl

a0x5cqrl2#

你不能得到预期结果的主要原因如下。

printf("%c\n", c);

这里c是地址类型而不是字符串,如果你想打印char数组的第一个值,你应该使用 *c,因为c是数组的第一个条目的地址,而不是值。
但是如果你想打印地址,打印类型应该是%d或者其他的,而不是%c。这就是printf(“%d\n”,a)工作的原因。
所以如果你想打印值,

printf("%d\n", *a);
printf("%c\n", *c);

如果你想打印地址,printf(“%d\n”,a);printf(“%d\n”,c);

相关问题