月度归档:2015年08月

c 语言中指针简介


一、指针简介

在c语言中,指针也有相应的类型(同其它数据类型一致),每个指针只能指向一种特定数据类型的变量,只能保存这类变量的地址。
例:
a 是指向int类型的指针,那么a就只能指向int类型的变量,不能指向其它非int类型的变量,
从a去间接访问的东西都被视为整型变量。


二、指针定义

定义指针时,需指定类型描述符,在被定义变量名前面加上* 号,就说明定义的为指针变量。
例:
int *a,*b,*c; //定义了三个整型指针 a b c ;
int *a,b[2],c,*d;//定义了两个整型指针 a ,d 一个数组b ,一个整型变量c;

在c语言中,所有的类型都可以定义为指针类型


三、指针操作


3.1 取地址运算符 &

把运算符&放入变量描述符前面,就能够求出变量的地址,是一个相应类型的指针值。
例:
#include “stdio.h”
int main(){
int a=100; //定义一个整型变量
int *b; //定义一个整型指针
int *c; //定义一个整型指针
b=&a; //将整型变量的地址赋值给指针变量
c=b; //将指针变量赋值给另外一个指针
printf(“b:%d c:%d\n”,*b,*c);
a=891;
printf(“b:%d c:%d\n”,*b,*c);
return 1;
}
//从上面的代码,我们可以看出,我们采用&取址符将整型变量a的地址赋给指针,所以指针也指向了整型变量的地址。
当我们输出变量的值,我们会发现同整型变量的值一致。

3.2 间接访问运算符*

间接运算是由指针获取指向地址的值,这种表达式可以像普通变量一样使用,放入表达式中作为一个数值参与计算,放入赋值运算中,则作为一个赋值表达式进行变量赋值操作。
例:
#include “stdio.h”
int main(){
int a=100;
int *b;
int *c;
b=&a;
c=b;
printf(“a:%d b:%d c:%d\n”,a,*b,*c);
a=891;
printf(“a:%d b:%d c:%d\n”,a,*b,*c);
*b=888; //指针赋值表达式
printf(“a:%d b:%d c:%d\n”,a,*b,*c);
return 1;
}
扩展:
++*b=++(*b);
*b++= *(b++); //根据 *和++的优先级组合

四、指针作为函数参数

由于指针中存储的是变量的地址,如果我们采用指针作为函数的参数进行传递,那么当变量在函数中发生变化后,就会直接体现到变量上。
#include “stdio.h”
void a(int * _a1);
int main(){
int a1=100;

printf(“a1:%d\n”,a1);
a(&a1);
printf(“a1:%d\n”,a1);
return 1;
}

void a(int * _a1){

*_a1=*_a1*921;
}
//以上我们可以看出,由于采用了指针变量作为参数,所以在函数内部可以直接通过变量的地址来改变变量的值。

c语言指针注意事项

指针注意事项有以下四点:

一、空指针

空指针是指针中的一类特殊值,这类指针没有指向任何地址,也是对任何指针类型都合法的指针值。
指针变量的值为空时,代表指针处于空闲状态,没有指向任何有意义的东西。
例:
int *a;
a=NULL;
a=0;
//指针指向0 和指针指向NULL都代表一个空指针。


二、指针初始化

定义指针后,可以采用合法的指针值对其进行初始化,如果不进行初始化, 外部变量 局部静态变量会被初始化为0,内部静态变量 寄存器变量都不会被初始化


三、指针中常见错误

3.1 指针非法访问
void main(){
int *a,b=3;
*a =3; //由于a没有指向任何地址,此时进行赋值操作,系统将报错
}


四、通用指针

在c语言中,有一种指针类型,可以指向所有类型的指针,我们称之为通用指针。
通用指针采用 (void *)表示,也被称为void指针。
如果把一个指针定义为通用指针,那么就可以将任何一个地址赋值给这个指针变量。
通用指针同其它类型指针之间的转换,需要做相应的数据转换:
例:
int *a;
void *b;
a=(int *)b;

c 语言指针与数组


一、指针和数组

数组在计算机中是按一个有序的序列保存同一类型的数据集合。
指针则是指向计算机的一个地址。
我们可以通过指针按顺序的访问数组元素,来完成达到访问数组中各元素的目的。


二、利用指针来访问数组

int *a1,*a2,*a3;
int a[5]={1,2,3,4,6};

a1=&a[0]; //将数组元素的首地址赋值给a1
a2=&a[3];
a3 =&a[4];

三、指针运算

在指针运算中,分两种:
3.1 对指针的地址进行运算
3.2 对指针地址所指向的值进行运算
例:
#include “stdio.h”

int main(){
int *a1,*a2;
int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};
int i=0;
a1 =a;
a2 =&a[3];
for(i=0;i<12;i++) printf("数组元素%d:%d\n",i,a[i]); printf("a1:%d\n",*a1); a1++; *a2=*a1+200; printf("a1:%d,a2:%d\n",*a1,*a2); for(i=0;i<12;i++) printf("数组元素%d:%d\n",i,a[i]); return 1; }


运行结果:
数组元素0:1
数组元素1:2
数组元素2:3
数组元素3:4
数组元素4:5
数组元素5:6
数组元素6:7
数组元素7:8
数组元素8:9
数组元素9:10
数组元素10:11
数组元素11:12
a1:1
a1:2,a2:202
数组元素0:1
数组元素1:2
数组元素2:3
数组元素3:202
数组元素4:5
数组元素5:6
数组元素6:7
数组元素7:8
数组元素8:9
数组元素9:10
数组元素10:11
数组元素11:12

相关阅读:
c语言字符数组和字符串