一维数组:
一维数组名:指针常量,保存数组元素的首地址
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”};
传到函数中是指针的指针
eg:void 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个元素的值
指针和数组的区别
| 数组 | 指针 |
空间分配 | 静态分配,连续分配 | 动态分配,不一定连续分配 |
访问效率 | 直接访问,效率高 | 间接访问,效率低 |
安全性 | 易越界 | 易内存泄漏 |
函数形参 | 默认转化为相应的指针 | 指针 |
用法 | 偏向于值的处理 | 偏向于地址的处理 |