在C语言中不理解func printf是什么意思。

3
这段代码:
char arr1[20] = "fedcba";
char *ptr;

ptr = &arr1[2];
puts(arr1);
printf("%d\n",*arr1 - *ptr);
printf("%d\n",arr1 - ptr);

我了解第一次打印输出字符串。 printf I - 应该打印什么?它说*arr1 - *ptr? printf II - 一个和两个有什么区别?

你理解 *arr1 的含义吗? - Donotalo
3个回答

3
第一个打印了两个字符之间的差异:
第二个打印了两个指针之间的差异。
*arr1 解引用了一个 char* 并返回第一个字符,也就是 'f'
ptr = &arr1[2]; 将使 ptr 指向 "dcba"。它获取了 arr1 中第三个字符的地址。 *ptr 返回 'd'
因此,第一个 printf 返回字符 fd 之间的差异-即 2
第二个打印是两个指针之间的差异。这是合法的,因为它们都指向同一字符数组内部。这与 arr1 - &arr[2] 相同,最可能是 -2,因为数组在内存中被连续存储。

1
printf("%d\n",*arr1 - *ptr);

这将打印出arr1的第一个字符减去ptr的第一个字符的结果。 以下是更清晰的版本,实现同样的功能:printf("%d\n",arr1[0] - ptr[0]);


printf("%d\n",arr1 - ptr);

这将打印出arr1ptr之间的指针差异,即2。

本质上,该属性成立的原因是:(a[x] - a)等同于x


ptr指向arr1中的第三个字符,因此第二个printf的行为不是未定义的! - Erich Kitzmueller

0
只需在您的程序中添加这两行代码,就可以更好地理解...
printf("\n%d AND %d... %c",arr1, *arr1, *arr1);
printf("\n%d AND %d... %c",ptr, *ptr, ptr[0] ); //ptr[0] == *ptr

希望这可以帮到你...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接