C语言之指针
1.*在不同场景的意义
int a,*p; //这里的*是指 指针变量说明符
p=&a;
*p=a; //这里的*是一个单目运算符,为取内容运算符,就是取指针变量p所存放的地址所对应的变量
2.指针变量的运算
包括赋值运算,加减运算,关系运算(可赋空值NULL)
赋值运算
1.把数组的首地址赋值给指向数组的指针变量
int a[5],*p;
p=a;//数组名就是一个数组的首地址
p=&a[0];
2.把字符串的首地址赋值给指向字符串类型的指针变量
char *a; //指针变量的大小是固定的(根据编译器,有的是2字节,有的是4字节),
//这里的char是指针变量指向的变量的类型
a="I like you";
3.把函数的入口赋值给指向函数的指针变量
int function(void);
int (*pf)(void);
pf = function; //function为一个int型函数的函数名
int function(void)
{
}
加减运算
1.指针变量的加减运算只能对指向数组(字符串算一个特殊的数组)的指针变量进行;
2.数组指针变量向前或向后移动一个位置,与地址加1减1在概念上是不同的,因为数组可以是不同类型,各种类型的数组元素的字节长度是不同的;
3.只有指向同一数组的两个指针变量相减才有意义,两指针变量相减之差是两个指针所指数组元素之间相差的元素个数;
int a[6]; //注意,数组名是一个指针常量,不是指针变量
int *p,*q; //指针变量p指向的变量类型要和要赋值的对象保持一致
int num;
p = a;
*p++ = 6; //++运算符 的优先级比 *取内容运算符 的优先级别高
a[1] = 6; //这一句与上面功能一致
p = &a[1];
q = &a[6];
num = q - p; //num的值等于5
关系运算
指向同一数组的两指针变量进行关系运算可表示他们所代表的地址之间的关系。
int *p,*q;
p == q //成立表示p和q指向同一数组元素
p > q //成立表示p处于高地址位置
空运算
对指针变量赋空值和不赋值是不同的,指针变量若未赋值时,可以是任意值,是不能用的,否则将造成意外错误。
比如单片机中的指针函数,如果没有赋值,单片机运行到这句就会不停重启;
而指针变量赋空值后,可以使用,只是它不指向具体的变量;
3.指针与数组
访问数组元素的4种方法
1.下标法,用a[i]的形式访问数组元素
2.指针法,用*(ptr+i)形式间接访问
3.数组名法,用*(a+i)
4.指针下标法,用ptr[i]
多维数组与指针
首先,关于多维数组,我在IAR平台测试发现,最多是8维数组,再增加一维就提示Error[Pe095]: array is too large
int arr[3][3];
int *p;
//p= (arr+1);//编译无法通过 Error[Pe513]: a value of type "int (*)[3]" cannot be assigned to an entity of type "int *"
//p= &arr[1];//编译无法通过 Error[Pe513]: a value of type "int (*)[3]" cannot be assigned to an entity of type "int *"
p= arr[1]; //P的结果是0XBEE
p++;
p= *(arr+1); //P的结果是0XBEE
p++;
p= &arr[1][0]; //P的结果是0XBEE
p++;
arr[1][0]= 4;
arr[1][0]++;
就是说:arr[i], &arr[i][0], *(arr+i) 是等效的,类型是 (指针)
而arr+i和 &arr[i] 的类型是 ()[3] (数组指针,或者行指针)
关于指针数组和数组指针的区别,点击下面:
链接: 指针数组和数组指针的区别.