第八章:指针07
让编程改变世界
Change the world by program
对使用字符指针变量和字符数组的讨论
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈……主要概括起来有以下几点:
1. 字符数组由若干个元素组成,每个元素中 放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。 2. 赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。 char str[20]; str = ″I love Fishc.com!″; 而对字符指针变量,可以采用下面方法赋值: char *a; a = ″I love Fishc.com!″; 但注意赋给a的不是字符,而是字符串第一个元素的地址。 3. 对字符指针变量赋初值: char *a = ″I love Fishc.com!″; 等价于 char *a; a = ″I love Fishc.com!″; 而对数组的初始化: char str[20] = {″I love Fishc.com!″}; 不能等价于 char str[20]; str[] = ″I love Fishc.com!″; 4. 如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。 而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址也就是说,该指针变量可以指向一个字符型数据。 但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据。 我们举个例子来说明 如: char str[10]; scanf("%s", str); 以上是完全可以的! 而常有人用下面的方法,目的是想输入一个字符串,虽然一般也能运行,但这种方法是危险的 : char *a; scanf("%s", a); 5. 指针变量的值是可以改变的,如: 改变指针变量的值 [codesyntax lang="c"]#include <stdio.h> void main() { char *a = "I love Fishc.com!"; printf("%sn", a); a += 7; printf("%sn", a); }[/codesyntax] 另外需要说明的是,若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。 下标形式引用指针变量 [codesyntax lang="c"]
#include <stdio.h> void main() { char *a = "I love Fishc.com!"; int i; printf("The sixth character is %cnn", a[5]); for( i=0; a[i] != '�'; i++ ) { printf("%c", a[i]); } printf("n"); }[/codesyntax]
指向函数的指针
用函数指针变量调用函数
可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数的入口地址就称为函数的指针。 指向函数的指针.c (点击下载源代码)用指向函数的指针作函数参数
函数指针变量常用的用途之一是把指针作为参数传递到其他函数。 前面介绍过,函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量等。 现在介绍指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。 [caption id="attachment_160" align="aligncenter" width="300"]