1.通过指针引用字符串
字符串的引用方式
在C语言中,字符串是存放在字符数组中的,想引用一个字符串,可以使用以下两种方法。
1. 用字符数组存放一个字符串,可以通过数组名和下标引用字符串中一个字符,也可以通过数组名和格式声明”%s”输出该字符串。
例如,定义一个字符数组,在其中存放字符串“I love China !”,输出该字符串和第8个字母
#include <stdio.h>
int main ()
{
char string []=”I love China !”;
printf(“%s”,string);
printf(“%s\n”,string [7]);
return 0 ;
}
2. 用字符指针变量指向一个字符串常量,通过字符指针引用字符串常量。
例如,#include <stdio.h>
Int main ()
{
char *string []=”I love China !”;
printf(“%s”,string);
return 0 ;
}
注意:通过字符数组名或字符指针变量可以输出一个字符串,但对一个数值型数组,是不能企图用数组名输出它的全部元素的。
2. 字符指针作函数参数
如果想把一个字符串从一个函数传递到另一个函数,可以用地址传递的方法,即用字符数组名作参数,也可以用字符指针变量做参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以引用改变后的字符串。
例如,用函数调用实现字符串的复制
#include <stdio.h>
int main()
{
void copy_string(char from[],char to[]);
char a[]="I am a student.";
char b[]="You are a teacher.";
char *from,*to;
printf("String a is %s\nString b is %s\n",a,b);
printf("Now copy a to b...\n");
copy_string(from,to);
printf("String a is %s\nString b is %s\n",a,b);
return 0;
}
void copy_string(char from[],char to[])
{
int i=0;
while(from[i]!='\0')
{
to[i]=from[i];i++;
}
to[i]='\0';
}
使用字符指针变量和字符数组的比较
1、字符数组由若干元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址,绝不是将字符串放到字符指针变量中。
2、赋值方式:可以对字符指针变量赋值,但不能对数组名赋值。
3、初始化的含义。对字符指针变量赋初值:
char*a="abc"; //定义字符指针,并把字符串的首地址赋给a。
charb[]="abc"; //定义字符数组,并把字符串赋给数组中各元素。
4、存储单元的内容。编译时:为字符数组分配若干存储单元,以存放各元素的值。而对字符指针变量,只分配一个存储单元。
5、指针变量的值可以改变,而数组名代表一个固定的值,不能改变。
例如,改变指针变量的值
#include <stdio.h>
Int main ()
{
char *a =”abc”;
a=a+7;
printf(“%s\n”,a);
return 0 ;
}
6、字符数组中各个元素的值可改变,但字符指针变量指向的字符串常量中的内容是不可被取代的。
7、char *format="a=%d,b=%d\n";printf(format,a,b);字符指针变量允许存放一句printf函数中的表达式。
3. 指向函数的指针
什么是函数指针
如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址成为这个函数的指针。可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。例如:
int (*p) (int ,int );
用函数指针变量调用函数,例如
#include <stdio.h>
int main()
{
int max(int,int); //函数声明
int (*p)(int,int); //定义函数指针变量
int a,b,c;
p=max; //指针指向max入口地址
c=(*p)(a,b); //通过指针变量调用max函数
printf(“max is %d”, c);
return 0;
}
int max(int x,int y) //定义max函数
{
return x>y?x:y ;
}
怎样定义和使用指向函数的中指针变量
定义指向函数的指针变量的一般形式:
类型名 (*指针变量名)(函数参数列表);
注意:函数指针不能进行算术运算!p+1,p-n是无意义的。
4.有关指针的小结
1、指针就是地址,但指针&指针变量不同。
2、指向意味着通过对象的地址。
3、一维数组名arr代表首元素地址,*p=arr;数组给指针p赋值首元素地址。
4、关于指针的归纳比较:
变量定义 类型表示 含义
int I int 定义整型变量i
int *p int * 定义p为指向整型数据的指针变量
int a[5] int [5] 定义有5个元素的整型数组
int *p[4] int*[4] 定义指针数组,由4个指向整型数据的指针元素组成
int (*p)[4] int(*)[4] p为指向包含4个元素的一维数组的指针变量
int fun() int () 返回int函数值的函数fun
int *p() int*() p为返回一个(指向整型数据的)指针的函数
int (*p)() int (*)() p为指向(返回整型数据的)函数的指针
int **p int ** p是一个指向整型数据的指针变量的指针变量
void *p void * p是一个指针变量,基类型为void,即p是一个不指向具体对象的指针变量
5、指针运算,明白以下含义:p++、p--、p+i、p-i、p=&a、p=arr、p=&arr[i]、p=fun、p1=p2。
6、指针变量可以有空值,p=NULL(在stdio.h头文件中#define NULL 0),它使p指向地址为0的单元。
注意:指针使用实在太灵活,对熟练的程序员可以编出高质、高效的代码,但对初学者要慎用,比如:未对p赋值的情况下,就向*p赋值会破坏其它单元内容。