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);
}