目录
- 1.字符指针指向一个字符
- 2.字符指针指向一个字符串
- 3.例题
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"
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