1

在以下 C 代码中:

char test[] ={'T','e','s','t'};

printf("%d\n",test == &test[0]); // Returns 1 - Okay as array varaible holds address of first element

那么以下内容不应该打印相同的内容吗?:

printf("value of test %c\n", test); // prints - '|' not even in the array
printf("value of test[0] %c\n", test[0]); // prints - 'T'

即便如此,即使这些打印出不同的值:

printf("value of test %p\n", test); // contains a address 0x7ffee9b22b7c
printf("value of test[0] %p\n", test[0]); // also conatains 0x100

怎么了?

谢谢

4

3 回答 3

2

您在第一个示例中回答了您自己的问题:

test == &test[0]

test != test[0] // otherwise, test[0] would have to be equal to &test[0]

即(解释为指针)的等于的地址。因此,您的以下示例不可能是正确的,因为这意味着对于其中任何一个,它的值都将等于它自己的地址,这是没有意义的!testtest[0]

(注:以下地址当然是示例。)

表达 类型 值解释为字符%c 值解释为指针%p
test char* 荒谬的 0x1000
&test char** 荒谬的 0x2000
test[0] char T 荒谬的
&test[0] char* 荒谬的 0x1000
test[1] char e 荒谬的
&test[1] char* 荒谬的 0x1001
test[2] char s 荒谬的
&test[2] char* 荒谬的 0x1002
test[3] char t 荒谬的
&test[3] char* 荒谬的 0x1003

注意:为了理解您最初的问题,可以将test视为char*,因此&test视为char**。然而,实际上它有点复杂,test实际上是 type char(*)[4]。例如,这会有所不同sizeof

于 2020-03-08T05:00:16.750 回答
1

您可能会对自己的打印方式感到困惑。试试这个,看看它是否更容易理解。

#include <stdio.h>


int main(){

    char test[] = "Test\n\0"; // an array that contains char values
    char *testptr; // a pointer that can point to a place in memory that contains a char value


    printf(test); // by default it will print all of the char values starting with test[0]

    testptr = &test[2]; // the pointer now points to the third position in the char array

    printf(testptr); // print the test array starting with the pointers position

}
于 2020-03-08T05:22:22.910 回答
0

指针衰减

虽然指针和数组是不同类型的变量,但数组变量通常被隐式转换为指向其第一个元素的指针。这称为数组到指针衰减

这就是您在testand之间进行比较时发生的情况&test[0]test衰减到一个可以与之比较的指针&test[0],并且它们的值相等

您的printf通话中发生了什么?

printf("value of test %c\n", test); // prints - '|' not even in the array
printf("value of test[0] %c\n", test[0]); // prints - 'T'

带有转换说明符的第一个%c将参数转换为unsigned char并打印字符。在第一行打印test为字符,在第二行打印test[0]为字符。

的类型test[0]确实是 achar所以正确的字符 (the T) 被打印出来。然而, 的类型test是一个 的数组char,在这种情况下,它也衰减为一个指针。在您执行测试时,此指针恰好具有0x7ffee9b22b7c. 然后将该值转换为,unsigned char以便保留指针的最后一个字节,在这种情况下,7c它恰好是 character 的 ASCII 码|

请注意,由于它取决于指针的值,因此每次运行程序时很可能会打印出不同的字符(其中一些甚至可能不是可打印的字符)。

这两个结果是不同的,因为它们是不同的东西:一个是字符,另一个是指针(在本例中是指向字符的指针)。

test[0]包含在数组开头的值,而test被评估为指向第一个元素的指针(然后强制转换为字符)。正如您之前提到的, thetest 等价于&test[0]不是test[0].

test[0]等价于*test(或*(test + 0))。一般来说,在一个数组中,array[i]将等价于*(array +i).

于 2020-03-08T05:12:33.773 回答