【自学备忘1】C语言 指针与数组

 

C语言的指针与数组

1、一维数组

 

#include<stdio.h>


int main()
{
	int a[10] = {10,5,4,9,7,5,7,8,4,5};	  //定义一个数组
	int b[10];
	int *p,*q,*pp;	     //定义指针
	int i;
	
	//  将指针指向一维数组;
	p = &a[0];    //让指针指向数组的首元素地址
	q = a;	     //  在一维数组里,数组名字代表的就是首元素(序号为0)的地址
	printf("%4d,%4d \n",*p,*q);
	
	//  利用指针给一维数组赋值;
	pp = b;   
	for(pp = b ;pp < b+10;pp++)     //  pp = b 等价于 pp = &b[0]   b+10等价于 &b[0]+10
	{
		scanf("%d\n",pp);       //  scanf输入的是指针所在的地址。所以不加*号
	}
	printf("\n");
	for(pp = b;pp < (b+10);pp++)
	{
		printf("%4d",*pp);
	}
}

这里需要了解结果几个知识点:

1)指针指向的是数组的首元素地址;

2)数组名代表的就是首元素地址;

3)scanf输入的到指针所代表的地址,也可以用&b[0]代替。

 

2、二维数组

 

#include<stdio.h>


int main()
{
	int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};	  //定义二维数组
	int c[3][4];  	//定义空二维数组
	int *p,*q;             //定义指针
	int (*pp)[4];        //定义数组指针
	int *qq[4];   	//定义了指针数组
	int i,j;
	
	//  将指针指向二维数组;
	p = &a[0][0];             //  将指针直接指向数组首元素;
	printf("1:%4d,%4d \n",*p,a[0][0]);      
	p = a[0];                       //  数组首元素也可以用上一维首元素代替,可以去掉地址符号;
	printf("2:%4d,%4d \n",*p,a[0][0]);   //  指针指向第一个第一个元素;
	printf("3:%4d,%4d \n",p+4,&a[1]);    //  指针的地址;
	printf("4:%4d,%4d \n",*(p+1),a[0][1]);    //指针指向数组元素的变化是通过相对位置计算的;
	printf("5:%4d,%4d \n",*p+4,a[1][0]);
	printf("6:%4d,%4d \n",*p+11,a[2][3]);
	//  利用指针输入输出二维数组;
	q = c[0];                // 先定义首元素;
	for(;q <= &c[2][3];*q++)   // 将最后一个元素定义为数组最后一个元素的地址;
	{
		scanf("%d",q);      //scanf需要输入的是地址,因此有那个q,而不是*q
	}
	printf("\n");
	for(q = c[0];q <= &c[2][3];*q++)   
	{
		printf("%d",*q);            
	}
			
	//  数组指针的运用与输出;
	pp = a;    //  因为*pp代表的就是 4个元素的一维数组地址 因此直接指向 二维数组名所代表的地址
	printf("1:%4d,%4d \n",*pp,a[0][0]);    //常规引用
	printf("2: %4d,%4d \n",**pp+1,a[0][1]);     // 想利用绝对物质输出想要的数组元素,需要两个** 但是不能超过4个个也就是声明数组的长度
	printf("3: %4d,%4d \n",*(pp+1),&a[1][0]);  // 因为pp代表的是一个二维数组下的一维数组地址,因此只用1个* 代表的只是地址
	printf("4: %4d,%4d \n",**(pp+1),a[1][0]);   
	printf("5: %4d,%4d \n",*(*(pp+1)+2),a[1][2]);
	//  数组指针的循环输入 错误案例;
    pp = c ;
	printf("please input the c: \n");
    for(pp = c;*pp < &c[2][3];**pp++)     // 这里因为指针的总长度只有4个,(*pp)[4],因此输入的元素超过4个就会结束
	{
		scanf("%d \n",*pp);
	}		
	for(pp = c; *pp < &c[2][3];**pp++)
	{
		printf("%4d \n",**pp);
	}
	//  数组指针的循环输入 正确案例;
	printf("please input the new c: \n");
    for(i = 0 ; i < 3 ; i++)     // 这里因为指针的总长度只有4个,(*pp)[4],因此输入的元素超过4个就会结束
	{		
		for(j = 0 ; j < 4 ; j++)
		{
			scanf("%d \n",*(pp+i)+j);
		}
	}
	printf("the new c : \n");
	pp = c ;	
   for(i = 0 ; i < 3 ; i++)    
	{		
		for(j = 0 ; j < 4 ; j++)
		{
			printf("%d \n",*(*(pp+i)+j));
		}
	}  
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值