深入理解字符串指针和字符串数组
2016-05-30 16:28
253 查看
首先我们来看一段程序:
它的输出结果如图:
分析:我们首先声明了一个字符串数组和一个字符串指针。然后将他们等同类型的输出做对比。
从输出结果我们可以看到,想要输出整个字符串。分别以%s格式输出str和ps即可。
1.字符串指针名ps和数组名str都存放着字符串的首地址。而字符串本身存放在以该首地址为首的一块连续的内存空间中,并以 '\0' 作为串的结束。
2.对str和ps分别取地址,以%s格式输出。
&str: 输出的结果仍然是字符串。
&ps: 输出的结果为乱码。
那么,这是什么原因呢?
实际上,对于字符串数组,str和&str都一样,都是字符串数组str[]的首地址。但类型不一样,一个是指向char的指针,一个是指向整个数组的指针。但是对他们分别+1效果就不一样了,一个偏移sizeof(char),一个偏移sizeof(char)*11(也就是整个数组的大小)。所以字符串数组可以理解为存在“双层地址”,但是这两个地址值都是一样的,都指向字符串首地址。
而对于字符串指针,ps和&ps相去甚远了。ps是整个字符串的首地址,由于并不存在类似数组的"双层地址“结构,所以ps已经是指向字符串最底层最基本的地址了,不具有数组名这一地址,只具有“单层地址”,所以对它进行&操作,然后以%s格式输出,这是不合法的,将一个地址以%s输出只能得到乱码。
3.如上图:对于字符串数组,我们加入了一个指针变量p,使它指向str,然后进行&p(相当于&&str)操作,以%s格式输出,结果才出现乱码。而对于字符串指针,只以%s格式输出&ps操作结果就显示乱码。我们将&&str和&ps分别以%p格式打印出来,输出结果显示为正常地址。证实了我们的“双层地址”和“单层地址”一说。
#include <stdio.h> int main() { char str[] = "hello code"; char *ps = "hello code"; char *p = str; printf("str: %s\n",str); printf("&str: %s\n",&str); printf("&&str: %s\n",&p); printf("&&str: %p\n",&p); printf("---------------------------------\n"); printf("ps: %s\n",ps); printf("&ps(s): %s\n",&ps); printf("&ps(p): %p\n",&ps); return 0; }
它的输出结果如图:
分析:我们首先声明了一个字符串数组和一个字符串指针。然后将他们等同类型的输出做对比。
从输出结果我们可以看到,想要输出整个字符串。分别以%s格式输出str和ps即可。
1.字符串指针名ps和数组名str都存放着字符串的首地址。而字符串本身存放在以该首地址为首的一块连续的内存空间中,并以 '\0' 作为串的结束。
2.对str和ps分别取地址,以%s格式输出。
&str: 输出的结果仍然是字符串。
&ps: 输出的结果为乱码。
那么,这是什么原因呢?
实际上,对于字符串数组,str和&str都一样,都是字符串数组str[]的首地址。但类型不一样,一个是指向char的指针,一个是指向整个数组的指针。但是对他们分别+1效果就不一样了,一个偏移sizeof(char),一个偏移sizeof(char)*11(也就是整个数组的大小)。所以字符串数组可以理解为存在“双层地址”,但是这两个地址值都是一样的,都指向字符串首地址。
而对于字符串指针,ps和&ps相去甚远了。ps是整个字符串的首地址,由于并不存在类似数组的"双层地址“结构,所以ps已经是指向字符串最底层最基本的地址了,不具有数组名这一地址,只具有“单层地址”,所以对它进行&操作,然后以%s格式输出,这是不合法的,将一个地址以%s输出只能得到乱码。
3.如上图:对于字符串数组,我们加入了一个指针变量p,使它指向str,然后进行&p(相当于&&str)操作,以%s格式输出,结果才出现乱码。而对于字符串指针,只以%s格式输出&ps操作结果就显示乱码。我们将&&str和&ps分别以%p格式打印出来,输出结果显示为正常地址。证实了我们的“双层地址”和“单层地址”一说。
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- C语言实现选择排序、冒泡排序和快速排序的代码示例
- 探讨C语言的那些小秘密之断言