*(p+i) = p[i] = a[i] = *(a+i)
p+i = &p[i] = &a[i] = a+i 一维数组
a[i][j] = *(a[i]+j) = *( *(a+i) +j ) 二维数组
指针与数组例程
#include <stdio.h>
int main()
{
unsigned char i = 0;
unsigned char a[5] = {0,1,2,3,4};
unsigned char *p = a;
for(i = 0; i < 5; i++)
printf("%d\n",*(p+i));
}
1.数组类似于指向位置固定的指针
即a除了不能 进行a++,其他用法和指针差不多
a的类型为int[2],p的类型为int *
a=数组的首地址
a = &a[0] = &a 只是地址相等 意义不一样
&a是一个数组指针 其类型为 int (*)[2];
a+1 相当于 a的地址+sizeof(int)*1
&a+1 相当于 a的地址 + sizeof(int [2])*1
#include "stdio.h"
int main()
{
int a[]={3,2,1};
int *p = a;
printf("p = %d\n",p);
printf("&a = %d\n",&a);
printf("a = %d\n",a);
printf("&a[0] = %d\n",&a[0]);
printf("&p = %d\n\n",&p);
printf("*p = %d\n",*p);
printf("a[0] = %d\n",a[0]);
}
2.指针与数组下标间的关系
*(p+i) = p[i] = a[i] = *(a+i)
p+i = &p[i] = a+i = &a[i]
假设 p=200 则 p+n =200+n*size
size = p所指向的类型的大小
#include "stdio.h"
int main()
{
int a[]={1,2,3};
int *p = a;
printf("*(p+1) = %d\t",*(p+1));
printf("p[1] = %d\n",p[1]);
printf("*(a+1) = %d\t",*(a+1));
printf("a[1] = %d\n\n",a[1]);
printf("p = %d\n",p);
printf("p+1 = %d\n",p+1);
printf("&p[1] = %d\n",&p[1]);
printf("a+1 = %d\n",a+1);
printf("&a[1] = %d\n",&a[1]);
}
3.一维数组作为参数传入函数
数组作为参数传入函数时,函数只会生成一个指针来保存传入数组的首地址
即 fun(int a[ ]) = fun(int* a)
数组作为参数传入函数被修改后,main中也会被修改,
而一般变量传入则不会
#include "stdio.h"
void fun(int a[])
{
a[0] = 6;
printf("f:sizeof(a) = %ld\n",sizeof(a));
printf("f:sizeof(int*) = %ld\n",sizeof(int*));
}
int main()
{
int a[]={1,2,3,4,5};
int *p=a;
printf("m:sizeof(a) = %ld\n",sizeof(a));//5*4
fun(a);
printf("m:a[0] = %d\n",a[0]);//5*4
}
4.指针与二维数组间的关系
a[i][j] = *(a[i]+j) = *( *(a+i)+j)
#include "stdio.h"
int main()
{
/*
a是二维数组的名字,也是二维数组的首地址,将一维数组看做一个整体,那可将a看做一维数组
a的类型为int (*)[3] a中元素为 a[0] a[1]
a[0]是一维数组的名字,也是一维数组的首地址 a[0]的类型为int *
a[0]中元素为 a[0][0] a[0][1] a[0][2]
a = *a = a[0]= &a[0][0]
a+i = &a[i]; *(a+i) = a[i]
a[i][j] = *(a[i]+j) = *(*(a+i)+j)
*/
int a[2][3]={1,2,3,4,5,6};
printf("一维数组:\n");
printf("a = %d\n",a);
printf("*a = %d\n",*a);
printf("&a = %d\n",&a);
printf("a[0] = %d\n",a[0]);
printf("&a[0][0] = %d\n\n",&a[0][0]);
printf("二维数组:\n");
printf("a[1][2] = %d\n",a[1][2]);
printf("*((a[1])+2) = %d\n",*((a[1])+2));
printf("*(*(a+1)+2) = %d\n",*(*(a+1)+2));
}