(C语言中的字符指针)

1.字符指针指向一个字符

int main()
{
  char ch = 'w';
  char *pc = &ch;
  return 0;
}

将一个char类型的变量的地址放到一个char*类型的指针里去,这里的char*ps就是字符指针 在这里的字符指针与之前的整形指针等的用法基本相同,不多做介绍


2.字符指针指向一个字符串

字符指针不但可以指向一个字符,并且还可以指向一个字符串 如下代码:

int main()
{
  char* pstr = "abcdef";//这里是把一个字符串放到pstr指针变量里了吗?
  return 0;
}

接下来我们可以分析:

  • "abcdef"是一个字符串,它占7个字节空间(因为后面还有一个看不见的\0),而pstr只是一个指针类型,它只有4或8个字节大小,7个字节大小的内容是不可能放zh到4个字节大小的指针中的。
  • 所以char* pstr = "abcdef"的意思压根就不是把abcedf放到pstr里去

这里实际上是把字符串"abcdef"首字符a的地址放到pstr里去 如下图: 在这里插入图片描述 接下来,我们可以使用字符指针,对字符串进行输出,因为输出的字符串,需要写%s类型,并且pstr里存的已经是字符串的首字符的地址了,所以可以直接输出字符串,代码如下:

int main()
{
	char* pstr = "abcdef";
	printf("%s\n", pstr);
	return 0;
}

输出结果: 在这里插入图片描述

因为pstr的类型是字符指针,可以存放单独的字符,可以对单独字符进行操作,所以可以通过指向字符串的字符指针对字符串内任一个字符进行操作,这里可以使用指针与int类型的加减实现

int main()
{
	char* pstr = "abcdef";
	printf("%c\n", *pstr); //这里pstr里存放的就是a的地址,直接解引用输出就是a
	printf("%c\n", *(pstr + 1));//这里指针加1,使指针指向下一个字符b,再解引用,输出b
	return 0;
}

输出结果: 在这里插入图片描述 这里的指向字符串的字符指针实际上与数组有些类似,还可以使用数组的形式取出字符

int main()
{
	char* pstr = "abcdef";
	printf("%c\n", pstr[1]);
	return 0;
}

输出结果: 在这里插入图片描述

这里可以看到printf("%c\n", *(pstr + 1))语句与printf("%c\n", pstr[1])的效果一样,都是输出字符串内的第二个字符 可以得出一个结论: 如果a是一个字符串或数组的首元素地址,x是一个整数(大小小于数组或字符串长度减1),*(a+x)a[x]是等价的

这里的代码其实不够标准: 因为是将常量字符串直接存到字符指针中,常量字符串是不能被修改的,如果后面有代码通过字符指针修改常量字符串,则程序会崩溃 所以最好是写成这样:const char* pstr ="abcdef"


这里还有一个小点:

平时我们想要输出一个字符串可以直接输出如:printf("hello");我们前面知道一个字符串的值其实就是它首字符的地址,所以可以看出printf里放一个字符串的首地址就可以输出这个字符串,而不用再写如printf("%s",str)一样的代码了

所以就有一下写法:

int main()
{
	char *str = "hello";
	printf(str);
	return 0;
}

3.例题

//输出结果是什么?
#include <stdio.h>
int main()
{
  char str1[] = "hello world.";
  char str2[] = "hello world.";
  const char *str3 = "hello world.";
  const char *str4 = "hello world.";
  if(str1 ==str2)
  	printf("str1 and str2 are same\n");
  else
	printf("str1 and str2 are not same\n");
  
  if(str3 ==str4)
	printf("str3 and str4 are same\n");
  else
	printf("str3 and str4 are not same\n");
  
  return 0;
}
  • 在进行char str1[] = "hello world."char str2[] = "hello world."两句时,会建立两个相互独立的空间,数组名表示数组首元素地址,所以str1!=str2

  • 在这里插入图片描述

  • 在进行const char *str3 = "hello world."和· const char *str4 = "hello world.",因为"hello world."是常量字符串,常量字符串是不可以被修改的,所以没有必要在内存中存两分,所以str3==str4

  • 在这里插入图片描述