内容正文:
第9章 指针
第9章 指针
指针变量
野指针与空指针
指针变量作形参
指针作函数的返回值
地址参与运算
指针与一维数组
一维数组作形参
指针与二维数组++
指向指针类型的指针
main函数和命令行参数
指向函数的指针变量
使用堆空间
典型命题
指向指针类型的指针
这节课我们讨论指向指针类型的指针。
3
字符串常量
字符串常量是用一对双撇号括起来的一串字符型字面量。
"Hello!"就是一个字符串常量。
字符串常量中的字符依次存储在地址连续的字符型存储单元中,并且这些存储单元位于一个只读的内存区域。只能读取不能修改的量称为常量。
整个字符串常量的值为存放其首字符的存储单元的地址。
如图所示字符串常量"Hello!"的值是char型地址0x0042109c。
字符串常量常用一个字符型指针变量保存(其首字符的地址)。
字符串常量是用一对双撇号括起来的一串字符型字面量。
"Hello!"就是一个字符串常量。
字符串常量中的字符依次存储在地址连续的字符型存储单元中,并且这些存储单元位于一个只读的内存区域。只能读取不能修改的量称为常量。
整个字符串常量的值为存放其首字符的存储单元的地址。
如图所示字符串常量"Hello!"的值是char型地址0x0042109c。
字符串常量常用一个字符型指针变量保存(其首字符的地址)。
4
char *str1 = "Hello!";
这条语句中字符串常量"Hello!"的值是为存放其首字符的存储单元的地址,因此,它可以赋值给字符型指针变量str1。str1指向首字符的存储单元。
printf("%s", str1);的输出结果为Hello!;
puts(str1);的输出结果为Hello!↙;
*str1的值为'H',putchar(*str1)的输出结果为H;
putchar(*(str1+4))的输出结果为o。
*str1='A';有逻辑错误,str1指向的存储单元只能读取不能写入。
这条语句中字符串常量"Hello!"的值是为存放其首字符的存储单元的地址,因此,它可以赋值给字符型指针变量str1。str1指向首字符的存储单元。
printf("%s", str1);的输出结果为Hello!;
puts(str1);的输出结果为Hello!↙;
*str1的值为'H',putchar(*str1)的输出结果为H;
putchar(*(str1+4))的输出结果为o。
*str1='A';有逻辑错误,str1指向的存储单元只能读取不能写入。
5
例9-17 分析下面的程序。
程序中定义了一个字符型数组ch,并用字符串"Hello!"初始化,数组ch各数组元素的值如图所示。
字符串常量"Hello!"赋值给字符型指针str1后,如图所示。
字符型变量str赋值为数组ch,str指向了ch[0],puts(str)输出从str指向的字符开始的字符串,即输出结果Hello!↙。
*(str+1) = 'i'即ch[1] = 'i',str[2] = '!'也就是*(str+2) = '!'即ch[2] = '!',*(str+3) = '\0'即ch[3] = '\0',赋值之后
数组ch各数组元素的值如图所示。数组ch中的字符串变为"Hi!"。puts(ch)的输出结果为Hi!↙。
puts(str1)输出从str1指向的字符开始的字符串,即输出结果Hello!↙。
*str1='A';有逻辑错误,str1指向的存储单元只能读取不能写入。会出现非法内存访问错误。
6
分析语句char *a[3];
语句中[ ]的优先级高于*,先分析(a[3]),定义一个长度为3的一维整型数组。数组元素的类型为char *,即字符型指针变量。
a[0] = "C";即字符型指针变量指向了字符串常量"C"。
char *a[3] = {"C", "C++", "Java"};定义并初始化了一维的字符型指针数组a,数组a的数组元素a[0]、a[1]和a[2]分别指向3个字符串常量,如图所示。
语句中[ ]的优先级高于*,先分析(a[3]),定义一个长度为3的一维整型数组。数组元素的类型为char *,即字符型指针变量。
a[0] = "C";即字符型指针变量指向了字符串常量"C"。
char *a[3] = {"C", "C++", "Java"};定义并初始化了一维的字符型指针数组a,数组a的数组元素a[0]、a[1]和a[2]分别指向3个字符串常量,如图所示。
7
分析程序
程序中puts会输出从实参地址标识的字符型存储单元开始的字符串。
a[0]的值为字符串常量"C"的首字符地址,因此输出为C↙;
a[1]的值为字符串常量"C++"的首字符地址,因此输出为C++↙;
a[0]的值为字符串常量"Java"的首字符