C 语言的指针数组,输出符号之大融合

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);	
  
}
(完)
原文地址:https://www.cnblogs.com/itxdm/p/c_pointer_bigfamily.html