指针:是指变量的地址
指针变量:是存放地址的变量
定义:类型名 *指针变量名 * 是指该变量的类型是指针类型 地址应该赋给指针变量,前面不加*
指针变量前加基类型以知道这个地址存放的是什么类型,只能指向相同的实型变量,相关运算也许要知道指针所指的数据类型。
指针变量只能存放地址,不要将一个整数赋给一个指针变量
引用指针变量:
(1)给指针变量赋值
p=&a //a的地址赋给指针变量p
(2)引用指针变量指向的变量
如pritnf("%d",*p);
*p=1;将整数1赋给p当前所指向的变量,如果p指向变量a,则相当于把1赋给a,即a=1
(3) 引用指针变量的值
printf("%o",p);
以八进制数形式输出指针变量p的值,如果p指向a,就是输出a的地址
指针变量作为函数参数可以通过调用函数使变量的值发生变化,在主调函数中可以使用这些改变了的值(不能通过改变指针形参的值来使指针实参的值改变)
(一般函数调用只可以得到一个返回值,使用指针作参数,可以得到多个变化的值)
通过指针引用数组
数组元素的指针就是数组元素的地址
p=&a[0];//p的值是a[0]的地址
p=a;//p的值是数组a首元素a[0]的地址
int *p=&a[0];等价于 int *p; p=&a[0];
定义时也可以写成 int *p=a;
在指针指向数组元素时,(1)如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素(地址加上一个数组元素的字节数)
(2)如果p的初值是&a[0],则p+i和a+i就是数组元素a[i]的地址,或者说,他们指向a数组序号为i的元素
(3)*(p+i),*(a+i)是指a[i]。(4)如果指针变量p1和p2都指向同一数组,如执行p2-p1,结果是p2-p1的值除以数组元素的长度,表示p2和p1所指的元素之间差的元素个数
所以引用数组元素可以通过a[i]或*(a+i)的形式
*p++,*(p++)和*(p--)先取*p值,然后使p加减1
*(++p)和*(--p)先使p加减1,然后取*p值
++*p和--*p表示p指向的元素值加减1
要在函数中改变数组中的元素值,可以实参和形参都用数组名,实参用数组名、形参用指针变量,实参形参都用指针变量,实参用指针变量、形参用数组名。
通过指针引用多维数组
多维元素的地址:对于二维数组a[3][4]来说,a代表二维数组首元素的地址,他不是一个简单的整型元素,而是四个整型元素所组成的一维数组,因此a代表的是首行(即序号为0的行)的首地址,a+1代表序号为1的行的首地址
如果二维数组的首行的首地址为2000,一个整型数据占四个字节,则a+1的值应该是2000+4*4=2016。a+1指向a[1]。a[0]代表一维数组a[0]中第0列元素的地址,即&a[0][0],也就是说a[1]的值是&a[1][0],a[2]的值是&a[2][0]
第0行1列的地址用a[0]+1表示,也可写*(a+0)+1 。*(a[0]+1)和*(*(a+0)+1 )和*(*a+1 )就是a[0][1]的值。
指向多维数组元素的指针变量:
(1)指向数组元素的指针变量
int * 指针变量名 a[i][j]=i*m+j
(2)指向由m个元素组成的一维数组的指针变量
int (* p)[4] 表示定义p为一个指针变量,它指向包含4个整形元素的一维数组,此时,p被定义为指向一维整型数组的指针变量,一维数组有4个元素,因此p的基类型是一维数组,其长度是16字节。这时不能指向数组中的某一元素 a是一维数组 p=&a(p指向一维数组行) 而不是p=a(p指向a[0])
(3)用指向数组的指针做函数参数
用指针变量作形参,指向变量的指针变量或指向一维数组的指针变量
通过指针引用字符串
字符串的引用方式:字符数组存放一个字符串,可以通过数组名和下标引用字符串中的一个字符,也可以通过数组名和格式声明%s输出该字符串。用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。
char * string="I love China" string指向字符串的第一个字符
C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放该字符串常量,这个字符数组没有名字,只能通过指针引用。在c中只有字符变量没有字符串变量。
字符指针做函数参数
(1)可用字符数组名作函数参数(2)用字符型指针变量作实参(3)用字符指针变量 作形参和实参
指向函数的指针
定义一个指向函数的指针变量,用来存放某一函数的起始地址。这就意味着此指针变量指向该函数
int (* p)(int,int) (注意:*p两侧的括号不可省略,表示p先与*结合,是指针变量,然后再与后面的()结合,()表示是函数)
怎样定义
类型名 (*指针变量名)(函数参数表列) (指针变量只能指向在定义时指定的类型的函数)
用指向函数的指针作函数参数
指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数
指针数组
元素均为指针类型数据的数组称为指针数组
定义:*类型名数组名[数组长度]
指向指针的指针
如 char **p 表示p指向一个字符指针变量(这个字符指针指向一个字符型数据),如果引用*p就得到指向的字符指针变量的值