指针数组 数组指针 二级指针

1、指针数组

        由指针组成的数组,数组的每一个元素均为一个指针。

        例:int *a[i] 

        1、1指针数组存储

        定义一个指针数组a,其数组的每一个元素均为一个指针,而指针在空间中占8个字节,根据数组的空间特性可知指针数组的空间大小为 : 元素个数*8 == i * 8

        1、2指针数组的用法

        主要用于字符串数组中,如下定义一个指针数组,其数组每个指针指向一个字符串的首地址。

        该数组可以理解为一个二维数组,不过与二维数组不同的是,二维数组存储的是字符串(即一维字符数组);指针数组中存储的是指向各字符串常量的首个字符的地址;

        即指针数组内每个指针所指向的值无法被改变

2、数组指针

        可理解为是指向数组的指针,即若对一维整型数组a取地址,则得到数组a的指针。

        该指针指向的为该数组整体,其内存空间大小取决于数据类型和元素个数,不再是8字节

3、数组与指针的关系

        3、1 一维数组与指针的关系

                即若有数组a,指针变量p,p=&a或p=a(一维数组名为指向第一个元素的地址的指针);

                即a[i]  ==  *(a + i)  ==  *(p + i)   ==  p[i]

        3、2 二维数组与指针的关系

                定义二维整型数组 

int a[m][n] = {0};
int *p = NULL;
int (*q)[n] = NULL;

p = a[m];
q = a;

                 其中p为指针变量,p = a [m]为p是二维数组中指向第一行第一个元素的地址,可安照一维数组与指针关系理解;p = a[m] + n表示为该行第几个元素;p=a[m+1]即为指向下一行;

                其中q 为数组指针,q  = a可理解为将二维数组看作由一维数组组成,a为该数组名指向第一个元素地址

                若要访问二维数组中的元素,有以下方式

                a[m][n]        按元素下标访问

                *(a[m] + n)         指向第m行第n个元素       

                *(*(a+m) + n)        按一维数组与指针关系演化(a[i]  ==  *(a + i)  ==  *(p + i)   ==  p[i])

                *(p + m*N + n)        N为列数,固定不变,p指向二维数组第一个元素地址,该方法按数存储的连续性访问

                *(*(q + m) + n)        数组指针q,指向第一个数组,+m则指向第m个数组的第一个元素,参考一维数组指针关系

                *(q[m] + n)        同上

                q[m][n]       

4、二级指针

        即指向指针的指针,常用在函数传参中

        像指针数组的数组名就是一个二级指针,即指向指针的指针。

        若要在函数要对外部指针变量操作修改时,传参就需要传递二级指针,即指针的地址

        例:

int fun(char **pptmp)
{
	*pptmp = "hello world";

	return 0;
}

int main(void)
{
	char *p = NULL;

	fun(&p);

	printf("p = %s\n", p);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值