您的位置:首页 > 编程语言 > C语言/C++

黑马程序员——C语言基础——指针2

2015-02-28 23:34 239 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
-------

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赋值会破坏其它单元内容。

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
-------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: