fik*_*ksx -3 c arrays pointers
我是编程新手,有些部分让我在学习指针时感到困惑.
代码1:
int main()
{
char string[]="hello";
char *my_pointer=string;
printf("first character is %c", *my_pointer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:第一个字符是h
代码2:
int main()
{
char array_of_words[]="one\0two\0three";
char *my_pointer=array_of_words;
printf("%s \n",my_pointer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:一
问题:
我在这里混淆,第一个代码中的printf函数部分使用星号符号表示指向内部指针(my_pointer),它是变量字符串的地址,引用指向内存地址的数组的指针字符串.数组中的第一个单词"hello".我的理解是真的吗?
当我在printf中更改%c时("第一个字符是%c",*my_pointer); 到%s,程序崩溃了.我想知道为什么我不能使用%s,如果我不使用printf中的my_pointer中的星号("第一个字符是%c",my_pointer),有什么不同?
在第二个代码中,my_pointer变量在{printf("%s \n",my_pointer);}中没有使用星号(*).在这段代码中my_pointer是指array_of_words变量的地址还是my_pointer里面的内容?以及为什么输出是'一'而不是'o'?
C字符串,数组和指针可能非常混乱.让我们来看看它们各自是什么.
指针指的是内存中的地址.你似乎对它们有些熟悉.可以把它想象成一个储物柜钥匙 - 它告诉你在内存中你可以存储数据的地方.
声明数组时,编译器会设置一个内存区域来存储它.您调用该数组的变量可以视为指向该数据开头的指针.例如,*string是字符串的第一个元素.
现在让我们将它应用到您的程序中.
两个程序都创建一个字符串并设置my_pointer为字符串起始的内存地址.my_pointer=string 表示"将变量的内容string(衰减到字符串开头的地址)复制到my_pointer."
在程序1中,读*my_pointer作" my_pointer指向的内存地址的内容".由于my_pointer点在字符串的第一个元素处,即字符h.
为什么当你替换它会崩溃%s?因为printf需要一个指向字符串的指针,所以它可以遍历整个数组.由于C是按值复制的,因此给它第一个元素的值是没有意义的,因为它无法获得任何其他元素.结果,printf尝试将字符作为内存地址读取,但失败了.一个好的编译器可能会看到并给你一个警告.
现在程序2. my_pointer引用内存中字符串的地址,而不是变量的地址array_of_words.输出是one因为将printf所有内容打印到第一个空字符(\0).由于第一个空值就在之后one,它会打印one然后点击空值并停止.