指针的世界欢迎你!
什么是指针
变量的指针和指向变量的指针变量
1.怎样定义指针变量
2.在定义指针变量是的注意事项
3.怎样引用指针变量
通过指针引用数组
1.指向数组元素的指针
2.指针的运算
3.通过指针引用数组元素
字符串与指针
1.字符串的指针
2.字符串指针变量
3.字符指针变量和字符数组比较
什么是指针
内存区的每一个字节都有一个编号。这就是“地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。
1.按变量地址存取变量值的方式称为“直接访问”方式。
2.另一种存取变量值的方式称为“间接访问”方式。即,将变量i的地址存放在另一个变量中。
在C语言中,指针是一种特殊的变量,它是存放地址的。
指针和指针变量的定义:
一个变量的地址称为该变量的“指针”。
例如:地址2000是变量i的指针。如果有一个变量专门用来存放另一变量的地址(指针),则称为“指针变量”。
变量的指针和指向变量的指针变量
怎样定义指针变量
定义指针变量的一般形式为
基类型 *指针变量名
下面都是合法的定义:
float *pointer_1;
char *pointer_2;
可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向该变量。
例如:
pointer_1=&i;
pointer_2=&j;
在定义指针变量时要注意两点:
(1)指针变量前面的“*”,表示该变量的类型为指针型变量。
例:float *pointer_1;
指针变量名为pointer_1,而不是*pointer_1。
(2)在定义指针变量时必须指定基类型。
需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。
下面的赋值语句是错误的:
float a;
int *pointer_1;
pointer_1=&a;
怎样引用指针变量
注意:指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。
对“&”和“*”运算符说明:
(1)& 取地址运算符
&a表示变量a所占据的内存空间的首地址。
(2)* 指针运算符
*p表示指针变量p所指向的内存中的数据。
指针变量的引用:通过指针变量访问所指变量。
1.将指针变量指向被访问的变量。
例:int a=5,*p,b;
p=&a;
2.访问所指变量
取内容:b=*p;
printf("%d\n",*p);
存内容:*p=100;
注意:*p若出现在“=”的右边或其他表达式中则为取内容,*p若出现在“=”的左边则为存内容。
通过指针引用数组
一个变量有地址,一个数组包含若干元素。
每个数组元素都在内存中占用存储单元,它们都有相应的地址。
指针变量既然可以指向变量,当然也可以指向数组元素(把某一个元素的地址放到指针变量中)。所谓数组元素的指针就是数组元素的地址。
指向数组元素的指针
定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。
例如:int a[10];
(定义a为包含10个整型数据的数组)
int *p;
(定义p为指向整型变量的指针变量)
应当注意,如果数组为int型,则指针变量的基类型应为int型。
对该指针变量赋值:
p=&a[0];
把a[0]元素的地址赋给指针变量p。也就是使p指向a数组的第0号元素。
指针的运算
C语言规定在指针指向数组元素时,可以对指针进行以下运算:
1.加一个整数(用+或+=),如p+1;
2.减一个整数(用-或-=),如p-1;
3.自加运算,如p++,++p;
4.自减运算,如p--,--p;
5.两个指针相减,如p1-p2(只有p1和p2都指向同一个数组中的元素时才有意义)
说明:
(1)如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
(2)如果p原来指向a[0],执行++p后p的值改变了,在p的原值基础上加d(是一个数组元素所占的字节数),这样p就指向数组的下一个元素a[1]。
(3)如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址,或者说,它们指向a数组的第i+1个元素。
(4)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
(5)如果指针变量p1和p2都指向同一数组,如执行p2-p1,结果是两个地址之差除以数组元素的长度。两个地址不能相加。
通过指针引用数组元素
引用一个数组元素,可以用:
(1)下标法,如a[i]形式;
(2)指针法,如*(a+i)或*(p+i)。其中a是数组名。p是指向数组元素的指针变量。其初值p=a。
例:输出数组中的全部元素。
假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法:
字符串与指针
字符串的指针
C语言的字符串是以’\0’作结束符的字符序列。
用字符数组存放字符串(即含’\0’的字符数组可以看作字符串)。
字符串指针就是字符数组的首地址。
例:char a[]=“Apple”;
char b[]={’c’,’h’,’i’,’n’,’a’,’\0’};
字符串指针变量
定义:char *指针变量
例:char *p,*q=“Language”;
p=“This is a book”;
例:char *p,c[10];
p=c;
字符指针变量和字符数组比较:
char a[]=“I love this game”,*p=a;
1.存储的内容不同:
字符数组可以存字符串,存的是字符;
字符指针变量存的是字符串在内存中的首地址。
2.赋值方法不同:
字符数组只能对各个元素赋值;(一次只赋一个字符,要赋若干次)
字符指针变量只赋值一次,赋的是地址。
例:char a[10],*p;
p=“China”; 正确
a=“Hello”; 错误
3.当没有赋值时:
字符数组名代表了一个确切的地址;
字符指针变量中的地址是不确定的。
例:char a[10],*p;
scanf("%s",a); 正确
scanf("%s",p); 错误
4.字符数组名不是变量,不能改变值;
字符指针变量可以改变值。
5.可以像数组那样用下标形式引用指针变量所指字符串中的字符。
6.字符串指针变量的应用:
可以用指针变量指向一个格式字符串,在printf中直接使用此指针变量。