一级指针,二级指针指针数组的理解

本文成分是有部分大佬的文章被我摘过来加一些我自己的理解,不得不说,对于写博客新手来说,看一看大佬的博客还是相当有裨益的。

一级指针和二级指针

一级指针就是我们常说的广义上的指针,根据指针定义指针是指向所要使用的数据在内存中的地址,如下代码,指针p是用来指向a存储数据10的地址的,等于说访问p相当于找到了a的房间号,*p就是进入房间获取房间内容,这个操作叫解引用。
二级指针就是指针的指针,一级指针对应的是a的房间号,p2指向的是p,因为p是指针,所以p2相对于a来说是指针的指针。p3是一个二级指针,但是它和p2不同,因为多个指针可以指向同一个地址。

int main()
{
       int a = 10;
       int* p = &a;
       int *p2=p;
       int **p3 = &a;
       printf("一级指针地址%p,p表示的值为%d",p,*p);
       printf("二级指针地址%p,p2表示的值为%d",p2,*p2); 
}

//myPrintf_pp
1.传来的是int pArray[5],pp[i]是pArray数组每个元素的内容,它们都是个指针,它们存的地址是任意的,可以连续,也可以不连续,因为里面存的是指针,所以再取内容才能得到里面的整数,即pp[i];
//myPrintf_p
1.传来的是int *pArray[5],(*pp)是pArray数组第一个元素的内容(就是第一个元素存的地址),它是个指针,它们存的地址是任意的,可以连续,也可以不连续
因为里面存的是指针,所以要得到pArray数组第一个元素内容里存的整数,需要再解引用才能得到里面的整数,即(*pp)[0];
//存的地址连续:(*pp)[1]是需要的整数;
//存的地址不连续:(*pp)[1]是乱码;因为此时的(*pp)[1]是pArray数组第一个元素里存的地址紧接着的后面的地址;
因为(pp)就是第一个元素存的地址,对它解引用((*pp)+i)就是取它后面的地址里的内容;

void myPrintf_pp(int **pp, int len )
{
       for (int i = 0; i < len; i++)
       {
              printf("第%d个数是%d\n", i, *pp[i]);
       }
}
void myPrintf_p(int **pp, int len)
{
       for (int i = 0; i < len; i++)
       {
              printf("第%d个数是%d\n", i, (*pp)[i]);
       }
}

指针和数组

他们之间的区别从以下
1.赋值
同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝
2.存储方式
数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,多维数组在内存中是按照一维数组存储的,只是在逻辑上是多维的。
数组的存储空间,不是在静态区就是在栈上。
指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。
3.求sizeof
数组:
数组所占存储空间的内存:sizeof(数组名)
数组的大小:sizeof(数组名)/sizeof(数据类型)
指针:
在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。

指针数组

指针数组是存放了指针的数组,它的实质是数组。
定义 int p[n];
[]优先级高,先与p结合成为一个数组,再由int
说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 p=a; 这里p表示指针数组第一个元素的值,a的首地址的值。

int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];

这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值

猜你喜欢

转载自blog.csdn.net/weixin_43510732/article/details/86634079