一、指针的含义
指针就是保存地址的变量
普通变量的值是实际的值
指针变量的值是具有实际值的变量的地址
*单目运算符 用来访问指针的值所表示的地址上的变量 可以放左值也可以放右值
易错点:int*p;//定义了一个指针未赋值,此时指针的值可能表示某一陌生地址,这个地址可能不能写入值,再赋值时就有可能引起程序崩溃
二、数组的有关含义
函数参数表中的数组实际上是指针
sizeof(a)==sizeof(int*)
但是可以用数组的运算符【】进行运算
数组变量是特殊的指针
数组变量本身表达地址int a[10];int*p=a//无需用&取地址
但是数组的单元表达的是变量,需要用&取地址
数组变量是const指针,不能作左值,不能被赋值
数组a 作为右值时其意义与&a[0]是一样,代表的是数组首元素的首地址,而不是数组的首地址。
a 和&a 的区别
a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是 a[0]的 首地址,&a 是数组的首地址
对指针进行加 1 操作,得到的是下一个元素的地址,而不是原有地址值直接加 1。所以,
一个类型为 T 的指针的移动,以 sizeof(T) 为移动单位。
int a[5]={1,2,3,4,5};
&a + 1:取数组的首地址,再加上sizeof(a)==5*sizeof(int)
a+1=a[1]
三、指针与数组
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身 决定。它是“储存指针的数组”的简称。int *p1[10];
数组指针:首先它是一个指针,它指向一个数组。在 32 位系统下永远是占 4 个字节, 至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。int (*p2)[10];
1.二维数组
char a[3][4];
a[i][j]元素的首地址为:a+ i*sizof(char)*4+ j*sizof(char)。同样,可以换
算成以指针的形式表示:*(*(a+i)+j)
易错点:int a [3][2]={(0,1),(2,3),(4,5)}相当于int a [3][2]={ 1, 3,5};
int a[5][5]; int (*p)[4]; p = a; 问&p[4][2] - &a[4][2]的值为多少?
&a[4][2]按上面的公式计算=&a[0][0]+4*5*sizof(char)+2*sizof(char)
&p[4]=&p[0]+4*4sizof(char)
所以&p[4][2]=&a[0][0]+4*4*sizof(char)+2*sizof(char)
2.二级指针
char **p
指向一级指针的地址
3.数组参数与指针参数
无法向函数传递一个数组,C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。同样的,函数的返回值也不能是一个数组,而只能是指针。
易错点:函数本身是没有类型的,只有函数的返回值才有类型。
实际传递的数组大小与函数形参指定的数组大小没有关系。
void fun(char *p) void fun(char a[10]) void fun(char a[ ])这三个是等价的
无法把指针变量本身传递给一个函数。
易错点:main 函数内的变量不是全局变量,而是局部变量,只不过它的生命周期和 全局变量一样长而已。全局变量一定是定义在函数外部的。
void GetMemory(char * p, int num)
{
p = (char *)malloc(num*sizeof(char)); //malloc 的内存的地址并没有赋给 str,而是赋给了_str。
}
两种办法获取该内存:
1.用return
char * GetMemory(char * p, int num)
{
p = (char *)malloc(num*sizeof(char));
return p;
}
2.用二级指针
void GetMemory(char ** p, int num)
{
*p = (char *)malloc(num*sizeof(char));
return p;
}
void fun(char a[3][4]); void fun(char (*p)[4]);void fun(char a[ ][4]);这三个声明等价
4.函数指针
char * (*fun1)(char * p1,char * p2);
fun1是一个 指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指 针。
5.函数指针数组
char * (*pf[3])(char * p);
这是定义一个函数指针数组。它是一个数组,数组名为 pf,数组内存储了 3 个指向函数的 指针。这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。
6.函数指针数组的指针
例:char * (*(*pf)[3])(char * p);
指针指向了一个包含三个元素的数组,数组里面存的都是指向函数的指针