C语言中字符数组和字符串指针分析
来源:互联网 发布:淘宝网ie8不能使用 编辑:程序博客网 时间:2024/04/30 02:02
这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么用到过C,虽然网上这类的文章也有很多,还是决定自己在这做个小总结,也算加深下自己的印象,写了下面的测试程序:
01
#include <stdio.h>
02
03
int
main(
int
argc,
char
*argv[])
04
{
05
06
char
day[15] =
"abcdefghijklmn"
;
07
char
* strTmp =
"opqrstuvwxyz"
;
08
09
printf
(
"&day is %x\n"
,&day);
10
printf
(
"&day[0] is %x\n"
,&day[0]);
11
printf
(
"day is %x\n"
,day);
12
13
printf
(
"\n&strTmp is %x\n"
,&strTmp);
14
printf
(
"&strTmp[0] is %x\n"
,&strTmp[0]);
15
printf
(
"strTmp is %x\n"
,strTmp);
16
17
getchar
();
18
return
0;
19
}
运行后屏幕上得到如下结果:
其实看到结果估计很多东西就好明白了,
先看看前三个输出也就是关于变量day的,在 char day[15] = "abcdefghijklmn"; 这个语句执行的时候,系统就分配了一段长15的内存,并把这段内存起名为day,里面的值为"abcdefghijklmn",如下图所示:
再看程序,第一个输出,&day,&号是地址运算符,也就是day这个变量的内存地址,很明显,在最前面,也就是a字符所在字节的地址;
对于第二个输出也就好理解了,&day[0],就是day数组中第一个变量(也就是a)的地址,因此他们两个是一样的;
第三个输出是day,对于数组变量,可以使用变量名来索引变量中的内容,其实这里的day可以理解成数组变量退化的指针,并且指向数组的开头,既然把它理解成指针,那么它的值肯定是地址了,所以他的值和上面两个也一样。
再看看后面三个输出,关于字符串指针strTmp,在执行char* strTmp = "opqrstuvwxyz";后,内存的图示如下:
如图所示,内存分配了两段内存,一个名为strTmp,类型是一个字符指针,另外一段是一个字符串常量,且strTmp里面存放着字符常量的首地址,注意这里无法通过strTmp修改这段字符串,因为是常量;于是程序中的后面三个输出就好理解了;
&strTmp:strTmp这个字符指针的地址
&strTmp[0]:strTmp所指字符常量第一个字符的地址
strTmp:strTmp这个字符指针的值,即字符常量的首地址
因此,最后两个的值是一样的。
指针可以这样理解,指针这种类型,和int,char,double等等是一样的,只是它用来保存地址值的,而int变量保存整数,char变量保存字符,仅此而已,就char型指针或者int指针,本质是一样的,都是存放的地址,只不过那个地址所里面的变量类型不同而已,还有一种void型指针,就是可以放任何类型变量的地址。
看了很有启发,小小优化一下:
01
#include <stdio.h>
02
03
int
main(
int
argc,
char
*argv[])
04
{
05
06
char
day[15] =
"abcdefghijklmn"
;
07
char
* strTmp =
"opqrstuvwxyz"
;
08
char
* strTmp1;
09
10
printf
(
"&day is %x\n"
,&day);
11
printf
(
"&day[0] is %x\n"
,&day[0]);
12
printf
(
"day is %x\n"
,day);
13
14
printf
(
"\n&strTmp is %x\n"
,&strTmp);
15
printf
(
"&strTmp[0] is %x\n"
,&strTmp[0]);
16
printf
(
"strTmp is %x\n"
,strTmp);
17
18
strTmp1 = strTmp;
19
strTmp =
"123456"
;
20
printf
(
"\n&strTmp is %x\n"
,&strTmp);
21
printf
(
"&strTmp[0] is %x\n"
,&strTmp[0]);
22
printf
(
"strTmp is %x\n"
,strTmp);
23
24
printf
(
"\n&strTmp1 is %x\n"
,&strTmp1);
25
printf
(
"&strTmp1[0] is %x\n"
,&strTmp1[0]);
26
printf
(
"strTmp1 is %x\n"
,strTmp1);
27
28
getchar
();
29
return
0;
30
}
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- C语言中字符数组和字符串指针分析
- 源码编译MySQL 5.1生成InnoDB存储引擎
- 自我简介
- [Other View] 【Oracle经典】132个oracle热门精品资料——下载目录
- UTC/GMT概念
- Tortoisegit 初步接触
- C语言中字符数组和字符串指针分析
- (Excel导出失败)检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败
- 单例在Spring中配置
- Android:TelephonyManager,MyPhoneStateListener监听手机信号强度
- Android自定义长按事件
- linux基础(一)------登录以及文件系统的了解
- Win32字控件-组合框
- 黑马程序员——浅谈java接口
- [Other View] 隆重推荐【SQLServer】127个SQL server热门资料汇总