谁能详细解释下面的c指针程序?

时间:2018-10-30 07:23:56

标签: c pointers

void main(){
   char a[2][30]={"Don't walk in front of me..", "I am not follow"};
   printf("%c%c", *(a[0]+9), *(*(a+0)+5));
}

程序的输出是

k

4 个答案:

答案 0 :(得分:3)

一些基于示例的说明...

c数组可以通过两种方式访问​​:

作为数组:

char a[10] = "0123456789";
printf("%c", a[5]); // prints "5"

作为指针:

char a[10] = "0123456789";
printf("%c", *(a + 5)); // prints "5"

在第二个示例中,我们只引用a作为指向字符串加5开头的指针。

这也可以用于2d,3d等数组:

char a[2][10] = {"012", "abc"};
printf("%c", *(*(a + 0)+1)); // prints "1"
printf("%c", *(*(a + 1)+1)); // prints "b"

您可以混合使用两种方法:

printf("%c", *(a[0] + 1); // prints "1"
printf("%c", *(a + 1)[1]; // prints "b"

仅出于完整性考虑(可以将其视为访问数组值的“常规”方式):

printf("%c", a[0][1]; // prints "1"
printf("%c", a[1][1]; // prints "b"

答案 1 :(得分:2)

输出不是k而是k[WHITESPACE]
在C语言中,所有变量都是数字。指针也是如此。


第一个%c

*(a[0] + 9)

a[0]是一个指针,因此对应于第a[0]个存储字节的数字。如果将其添加9,则会再增加9个字节。

a[0]指向"Don't walk in front of me"的第一个字符:D
然后,如果您在a[0]上加上9,则会获得字符串中第十个字符的地址:k

*()表示您不想要a[0] + 9的值(0x hexNumber ),而是值寻址的{{1 }}:k(107)


第二a[0] + 9

%c

  • *(*(a+0)+5))*(a + 0)所指向的值:a + 0
  • a[0]:我真的应该重新解释一下吗?

希望这能回答您的问题!

答案 2 :(得分:0)

char a[2][30]

这告诉程序在堆栈上制作2x30个字符的2D数组。它只是一个连续的60 chars块,但是允许程序使用a [2] [3]这样的符号时知道您要访问的正确位置。

{"Don't walk in front of me..", "I am not follow"};

这是所谓的“用于字符和宽字符数组的字符串文字初始值设定项”。数组将填充这些字符串文字的内容(末尾包含'\0')。请注意,这不会填满所有60个字符,空终止符之后的其余字符也将填满'\0'

printf("%c%c",

这将打印在调用的以下参数中指定的两个字符。

*(a[0]+9)

这将获取第一个字符串的地址,将9添加到其中,从而获取kwalk的地址。然后将其取消引用,从而得出char k

*(*(a+0)+5));

这做的事情非常相似,只是写成a[0]而不是*(a+0)。您只需要添加9而不是5,而不是'k'就可以得到' '(单词Don't和{{ 1}})。

这就是打印walk的方式(这是"k "和一个空格,而不仅仅是k。)

答案 3 :(得分:0)

您可以这样编写char数组a

char a[2][30]={{"Don't walk in front of me.."}, //a[0][30]
              // 0123456789 - *(a[0]+9) is a[0][9] is `k`
              // 012345 - *(*(a+0)+5) is is a[0][5] is ' '
               {"I am not follow"}}; //a[1][30]     

因此,输出将为k,后跟空格。您可能看不到控制台上的空间。