数组及数组和指针的区别

一维数组

一维数组名:指针常量,保存数组元素的首地址

a[n]其中n不可以为变量

int a[] = {1,2,3};  sizeof(a) = 12;

for(i = 0; i < MAX_SIZE; i++)

{

scanf(%d, &a[i]);//a+i;*p=a;p+i;&p[i];,p++;

}

for(i = 0; i < MAX_SIZE; i++)

{

printf(%d, a[i]);//a+i;*p=a;p+i;&p[i];,p++;

}

&a(对一维数组的数组名取地址):数组的地址

a:指针常量数组首元素的地址

*(&a) = a:对一维数组的地址取值 = 数组首元素的地址

传一维数组名;void p_ptr(char ptr[100])在机器处理是void p_ptr(char *ptr)其中sizeof(ptr)=4

数组指针变量:

int (*pa)[3] = &a;//int (*pa)[3]; pa = &a;

scanf(%d, a + i);//*pa+i

 

 

 

 

二维数组

二维数组名:指针常量,保存首个一维数组的首地址

int a[2][2] = {1,2,3,4};  a[][2] = {1,2,3,4}

for(i = 0; i < MAX_SIZE; i++)

{

for(j = 0; j < MAX_SIZE; j++)

{

        scanf(%d, &a[i][j]);//*(a + i) + j;

    }

}

for(i = 0; i < MAX_SIZE; i++)

{

for(j = 0; j < MAX_SIZE; j++)

{

        printf(%d, a[i][j]);//*(*(a + i) + j);

    }

}

*(*(a+i)+j)

a+i;第i+1个一维数组的地址

*(a+i):第i+1个一维数组的首元素的地址

*(a+i)+j:第i+1个一维数组的j+1个元素的地址

*(*(a+i)+j):第i+1个一维数组的第j+1个元素的值

*(&a) = a:对二维数组地址的取值 = 首个一维数组的地址

 

指针数组和二维数组

char src[3][100];

char (*p_src)[3];

scanf(%s,src[i]);//*(src + i);

p_src = &src;   *p_src==src

传二维数组名a[3][100]

void p_printf(char (*a)[100])(一维数组指针,100不可不写)

 

 

指针数组 

int *pa[3];

int i;

for(i = 0; i < 3; i++)

{

pa[i] = (int *)malloc(sizeof(int));

scanf(%d, pa[i]);

}

for(i = 0; i < 3; i++)

{

printf(pa[%d] = %d, i, *(pa[i]));

}

另一种赋值方式

char *ptr[3] = {hello1, hello2, hello3};

传到函数中是指针的指针

egvoid print_ptr(char **ptr)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三维数组

三维数组名:指针变量表示首个二维数组的地址

*(*(*(a + i) + j) + k)
a + i:第i+1个二位数组的地址

*(a + i);第i+1个二位数组的首个一维数组的地址

*(a + i) + j:第i+1个二位数组的第j+1一维数组的地址

*(*(a + i) + j):第i+1个二位数组的第j+1一维数组的首元素的地址

*(*(a + i) + j) + k:第i+1个二位数组的第j+1一维数组的第k+1个元素的地址

*(*(*(a + i) + j) + k):第i+1个二位数组的第j+1一维数组的第k+1个元素的值

 

指针和数组的区别

 

数组

指针

空间分配

静态分配,连续分配

动态分配,不一定连续分配

访问效率

直接访问,效率高

间接访问,效率低

安全性

易越界

易内存泄漏

函数形参

默认转化为相应的指针

指针

用法

偏向于值的处理

偏向于地址的处理

 

 

 

 

 

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值