C 语言的指针数组,输出符号之大融合
问题1:为什么第7段,只能写 *p
#include <stdio.h>
int main( int argc, char const *argv[])
{
char s[] = "hello"; // 定义了数组,指向 hello
char* p = &s[1]; // 定义了指针,对 hello 进行搜索
printf("%c
",*p);
}
写成 *p
是因为上方指定了 &s[1]
。
本质上我是在将值以%c
的方式打印,如果写成 p
就是再将地址以%c
的方式打印。
问题2:那么什么情况下可以改为 p
#include <stdio.h>
int main( int argc, char const *argv[])
{
char s[] = "hello"; // 定义了数组,指向 hello
char* p = &s[0]; // 定义了指针,对 hello 进行搜索
printf("%s
",p);
}
有没有发现,我把 &s[1]
改成了 &s[0]
就可以了?
这是因为原本 &s[1]
是将地址指向了 hello, h->0, e->1
中的 e
,所以打印的时候就只能将 e
打印出来了。但如果我将地址指向了 &s[0]
其实是指向了数组本身。
这个时候,由于本身就属于数组所以用 p
就可以使用 %s
打印出来。
注意俩个地方:
1、&s[0]
与 s
等价,这一点要时刻提醒自己。
2、不能将 &s[0]
写成 &s
。这是因为上述 char s[] = "hello";
中 s[]
就等于 s[6]
,而如果你直接写成 &s
实际就等于 s[6]
。当然,你可以改成 问题1
的方式来进行访问,但要注意 s[6]
要改为 s[5]
。至于为啥是 6 而不是最大的 5,暂时没有答案。
问题3:这一段代码有什么问题?
#include <stdio.h>
int main( int argc, char const *argv[])
{
char s[] = "hello"; // 定义了数组,指向 hello
char* p = &s[1]; // 定义了指针,对 hello 进行搜索
printf("%c
",p);
}
这一段的问题就是 问题1
的问题,不能将 p
也就是地址,打印为字符也就是 %c
。
如果没有搞懂的话,再回头看 问题1
加粗的那部分。
这段有俩种改正方式:
1、 将 %c
改为 %p
进行地址的打印
#include <stdio.h>
int main( int argc, char const *argv[])
{
char s[] = "hello"; // 定义了数组,指向 hello
char* p = &s[1]; // 定义了指针,对 hello 进行搜索
printf("%p
",p);
}
2、将 p
改为 *p
打印出字符信息
#include <stdio.h>
int main( int argc, char const *argv[])
{
char s[] = "hello"; // 定义了数组,指向 hello
char* p = &s[1]; // 定义了指针,对 hello 进行搜索
printf("%c
",*p);
}