指针与数组的关系

*(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));
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值