一、什么是指针
定义一个变量,系统会为变量分配内存单元,内存单元的每一个字节有一个编号,这个编号就是地址,所以这个地址就指向该变量单元,地址形象化地称为“指针”,也就是说通过它可以找到以它为地址的内存单元。
二、指针变量
定义指针变量:
基类型 *变量名
int *name //整型
char *name //字符型
double *name //双精度浮点型
float *name //单精度浮点型
...
如何存放进地址:
int i = 1000;
int * point;
point = &i; //&取地址,把1000在的内存单元的地址给指针point
两种访问方式:
直接访问:直接按变量名进行的访问
间接访问:将变量i的地址存放在另一变量中,然后通过该变量来找到变量i的地址,从而访问i变量
注意:
①一个变量的指针的含义包括两个方面,一是以存储单元编号表示的纯地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float等)
② * 指针运算符(或称“间接访问”运算符),*p代表指针变量p指向的对象
*p = 1; //赋值语句
指针变量还可以作为函数参数
这个函数进行了值的交换,无返回值,
#include<stdio.h>
void swap(int *p,int *q)
{
int temp;
temp = *p;
*p = *q;
* q = temp;
printf("*p = %d *q = %d",*p,*q);
}
int main()
{
int a = 10,b =20;
int * p ,*q;
p = &a;
q = &b;
swap(p,q);
}
三、通过指针引用数组
int a[10] = {1,2,3,4,5,6,7,8,9,0};
int *p;
p = &a[0]; //元素a[0]的地址赋给指针变量p ①
p = a; //a是数组名,因此可以表示数组元素的首地址 ②
所以①和②等价
引用数组元素的方法:
① 下标法:通过下标分别表示数组中的每一个元素,a[0],a[1],a[2],…
② 指针法:通过指向数组元素的指针找到所需的元素,(a+i),(p+i),
指向数组的指针的运算(p 为指向数组中一个元素的指针)
①加减一个整数:p + 1;p - 1;
p+1是指向同一个数组中的下一个元素,
②自加自减运算:p++;++p,–p,p–;
③两个指针之间的运算:p1 - p2(只有两个指针都指向同一个数组中的元素时才有意义)
四、通过指针引用字符串
字符串是存在字符数组中,就像这样
char array[20]= {"i love China"};
char *p = array;
也可以直接通过指针引用数组
char *p = {“i love China”};
二者是等价的,都用了数组,只是第二个相当于是一个没命名的数组。
五、指向函数的指针
如果想调用一个函数,除了可以通过函数名调用以外,还可以同过指向函数的指针变量来调用该函数。
int main()
{
int max(int,int);
int (*p)(int,int);
int a,b,c;
p = max;
printf("请输入a和b:");
scanf("%d %d",&a,&b);
c = (*p)(a,b);
printf("%d \n %d\n max = %d \n",a,b,c);
return 0;
}
int max(int x,int y)
{
int z;
if(x>y)
z=x;
else
z= y;
return (z);
}
类型名 (*指针变量名)(函数参数表列)
六、返回指针值的函数
七、指针数组和多重指针