首页 > 代码库 > C语言---指针

C语言---指针

C语言中对变量的访问有两种方式:

1)直接访问,通过变量名;

2)间接访问,通过地址来访问某一个变量,该变量的地址是另一个变量的内容。

事实上,程序经过编译后,对变量的访问都会变为从地址的访问。

printf("%d \n", i);

scanf("%d \n", &i);   //scanf语句使用&i来访问

 

一个变量的地址称为该变量的指针,地址被形象的称为指针,如果一个变量专门用来存放另一变量的地址,它被称为

"指针变量",指针变量的值---是另一个变量的地址,指针变量的地址---是本身变量的地址。

 

定义指针变量:

类型名   *指针变量名;

int *point_1;

int *point_2 = &b; //定义时,初始化

指针变量名前的"*"表示变量为指针变量,point_1的值表示另一变量的地址,*point_1表示另一变量的值

                                                     &point_1表示该指针变量的地址

定义指针变量时,必须制定基类型,因为访问一个变量不但需要知道首地址,还需要知道访问的字节数。

&取地址运算符; *指针运算符

 

指针在调用指针运算符,对另一变量赋值的时候,必须先对指针的值进行初始化,否则,指针指向的地址未知,容易发生错误。

int * temp;

*temp = *p1;   //容易产生错误

 

当指针变量作为函数参数时,它表示将一个变量的地址传送给另一变量。 

void swap(int *ptr1, int *ptr2) {

int *temp;

temp = *ptr1;           //输入指针交互各自内容,temp可以定义为普通int变量

*ptr1 = *ptr2;

*ptr2 = temp;

}

void swap(int *ptr1, int *ptr2) {

int *temp;

temp = ptr1;        //输入指针各自指向的地址交换

ptr1 = ptr2;

ptr2 = temp;

}

数组名作为函数的实参传递时,也是表示指针的传递。

void main () {

fun(array,10);

}

void fun(int arr[], int n) {

}

实参用指针、数组表示,形参用数组、指针表示都是等价的。

 

通过指针引用数组。数组本身也是一种特殊的指针:

int a[10];

int *ptr;

ptr = &a[0];  //C语言中数组a[10]的地址,可以用&a[0]或者a来访问

ptr = a;  //与&a[0]等价

数组元素的引用:

下标: a[i];

指针:*(a+i)

*(p++),表示先取*p的值,然后p自加1;

*(++p),表示p先自加1,然后再取*p的值;

 

C语言中,字符串是存放在字符数组中的,有两种表示方法:

1) 用字符数组存放一个字符串,通过数组下标引用某个字符,%s+数组名输出整个字符串,%c+数组下标输出某个字符

   char string[] = "I am a big man"

   printf("%s\n",string);

   printf("%c\n",string[4]);   //最后一个字符存放"\0"

2) 用指针变量指向一个字符串常量

   char *string = "I am a big man"

   等价于 char *string;  string = "I am a big man"   //对字符指针的访问不需要加"*"

 

指向函数的指针,系统编译的时候,编译系统会为子函数代码分配一段存储空间,这段存储空间的起始地址称为这个函数的指针。

int (*p) (int,int)表示指向一个返回值为int,且有两个int 参数的函数。

所以函数的调用可以使用函数名直接调用,也可以通过函数指针来调用。

int main() {

int max(int, int);    //函数声明

int (*p)(int, int);     //函数指针声明

int a,b;

p = max;  //使得P指向max函数

c = (*p) (a,b);  //通过函数指针调用函数

}

 

返回指针的函数定义:  类型名  *函数名(参数列表)

float *search (float *point, int b)   //返回值为float *类型的指针

指针数组:一个数组,其中的每个值都是指针变量,类型名 *数组名[数组长度]

int *p[4];  //[]优先级比*高,所以先形成p[4]形式,后加*p

int (*p)[4];  //表示指向一维数组的变量

 

动态分配内存空间,

void  *malloc(unsigned int size);  //分配大小为size字节的连续空间,赋值时,最好强制转换指针类型。

void  *calloc(unsigned n, unsigned int size);  //分配n个连续的size字节大小的连续空间,赋值时,最好进行强制类型转换。

void  *free(void *p);  //释放指针p指向的已分配的动态空间。

void  *realloc(void *p, unsigned int size);  //已分配过的地址,重新改变其大小。将p指向的地址,改为size大小。

 

将void类型的指针赋值给不同的基类型的指针变量时,不需要用户进行强制类型转换,编译系统会自动进行转换。

 

C语言---指针