一级指针
一级指针就是初识指针时的所知道的指针,编译器会给他分配四个字节的大小,它的里面存储着一个地址。值得注意的是,当一个指针变量被定义后,不管往这个变量中存储任何值,他都会认为这是一个地址,并以地址的方式对他解读,
一级指针的定义
例如:
int main()
{
char a;
char* pa=&a;
int b;
int* pb=&b;
char* pstr="i love u";
}
其中,pa,pb,pstr都是指针变量,可以发现,只需在它所要指向的数据类型后加*就变成相应类型指针的定义。
一级指针的使用
例如:
int mian()
{
int a=0;
int* pa=&a;
*pa=10;
}
这时候就要用上这个解引用运算符,他将指向pa中的地址的位置,可以理解,这里的pa与a是等价的。
二级指针
对指针理解的方法介绍
二级指针是存储指针地址的指针,一般大家看到这里有时候就会混乱,这里我介绍一下我的方法:
1.了解指针的类型:例如
int main()
{
int a=0;
int* pa=&a;
int** ppa=&pa;
int*** pppa=&ppa;
}
这里我想问你,pppa的类型是什么?
没错 它的类型我想聪明的你已经知道了(心里想,这么简单的问题怎么难的住我)
pppa的类型是 int***。
看指针的类型时,只需要把它的名字去掉,剩下的就是它的类型。知道指针的类型我们就要知道指针指向的类型了
2.了解指针指向的数据类型:
问题又来了,pppa指向什么类型的数据?
这肯定也难不倒聪明的你啦
pppa指向的数据类型时 int**。
看指针所指向的类型时,只需要把他的名字和属于它的前面的*去掉就是它所指向的数据类型。
如果理解了上面两个知识点,那么二级指针也就很好理解了
二级指针定义
例如:
int main()
{
int a=0;
int* pa=&a;
int** ppa=&pa;
}
其中ppa就是二级指针,他指向类型为int*的指针pa,因此给他赋值时用&pa;
二级指针的使用
二级指针一般用于传参数的时候,比如要传一个指针数组(后面会说)的时候,或者对指针的地址进行改变
例如:
int main()
{
char arr[5]={1,2,3,4,5};
char* parr=arr;
char** pparr=&parr;
**pparr=6;//将数组第一个元素变为6
*(*pparr+1)=7;//将数组第二个元素变为7
}
指针和数组
写在开头的话:指针就是指针,数组就是数组,他们不一样!
为什么很多人会混淆这两个东西,是因为他们有一些共用的东西。
指针
编译器会为指针变量分配四个字节,这四个字节存储着某个数据的首地址,对任何放入指针变量的数据都会被当作地址来处理
数组
例如 int a[5],编译器就会为其分配大小为sizeof(int)*5字节的空间,数组中存放若干个是同一种类型的元素,数组中不能存放函数。
值得注意的是数组名,
a:表示数组首元素的首地址
&a:表示数组的首地址
这两个的值是一样的,但是意义却不同 例如
main()
{
inta[5]={1,2,3,4,5};
int*ptr=(int*)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
会输出 2 和5
原因是,a的类型是char* ,&a的类型是char(*)[5](这是数组指针后面会说)因此两者加1的结果也不相同,需要你自己慢慢理解
指针数组和数组指针
理解这两个东西很容易,后缀名字是什么,他的本质就是什么
首先思考这三个是什么
int(*p)[5];
int*p[5];
指针数组
指针数组通过后缀名就可知道是数组,这个数组中存储的是指针。
指针数组的定义
指针数组就是上个代码块中的int*p[5]
,
其中数组名是p,数组长度为5,数组元素类型是int *。
数组指针
数组指针通过后缀名就可知道是指针,这个指针指向的数据类型是数组。
数组指针的定义
int(*p)[5];
为什么和数组指针的定义看起来那么相像呢?答案在于运算符的优先级,其中[]的优先级比*高,但是()的优先级是最高的,因此可以这么理解,在指针数组中,p先与[]结合,即p已经成为了数组了,剩下的就是数组元素的类型了。在数组指针中,p先和*结合,说明它是一个指针了,剩下的就是指针指向的数据类型了。