基于Linux的C语言

本文详细介绍了Linux环境下C语言的二维数组,包括概念、定义和使用,强调了二维数组的初始化及指定和不指定大小的情况。接着探讨了二维数组与指针的关系,解释了数组指针的概念、定义和实例。此外,还讲解了指针数组和多级指针的原理,包括它们的定义和应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二维数组与指针

一,二维数组

1,二维数组的概念

        二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。也可以理解为一维数组中的数组,二维数组中的元素也就是一维数组中的元素。

2,二维数组的定义

        类型说明符: 数组名[常量表达式][常量表达式]。

3,二维数组的使用

4,二维数组的初始化

        按照一维数组的顺序依次进行初始化,可以部分初始化(没被初始化的元素默认为0),也可以进行全部初始化。

4.1,指定二维数组的大小

        举例说明:

#include<stdio.h>
int main()
{
	float buf1[2][3]={1,2,3,4,5,6};	//全部初始化

	float buf2[3][4]={8,9,7,6,5};	//部分初始化

	for(int a=0;a<2;a++)
	{
		for(int b=0;b<3;b++)
		{
			printf("%f ",buf1[a][b]);
		}
	printf("\n");
	}
	printf("二维数组的全部初始化\n");

	for(int i=0;i<3;i++)
	{
		for(int j=0;j<4;j++)
		{
			printf("%f ",buf2[i][j]);
		}
	printf("\n");
	}
	printf("二维数组的部分初始化\n");




}

 4.2,不指定二维数组的大小

        举例说明:

#include<stdio.h>
int main()
{
	float buf1[][3]={1,2,3,4,5,6};	
	float buf2[][4]={{1},{2},{3,3},{4}};	

	printf("buf1 size is %ld",sizeof(buf1));
	printf("buf2 size is %ld",sizeof(buf2));
}

 

二,二维数组与指针

        ⼆维数组的数组名就是整个数组的⾸地址(数组中的第0个元素的地 址)

        对于二位数组而言,二位数组的地址就是一维数组的地址。

        当        数组名 +1 :表⽰移动一个⼆维数组的元素(⼀维数组)的⼤⼩地址

        当        数组名[数组元素] + 1:表⽰移动一个⼀维数组的元素(普通数据)的⼤⼩地址

        *数组名=*(&数组名[数组元素])代表的含义就是:取函数值

        

//二维数组与指针
#include<stdio.h>
int main()
{
	int buf[3][4]={{1,2,3,4},{5,6,7,8},{9,10}};

	int *p;

	p = buf[1];	//代表的含义是:变量p等于数组下标索引为1的这个整个一维数组,即:a[1][4]
	
	printf("%d %d\n",*p,*(buf[1]+0));	//*p and *(buf[1]+0) 都表示取数组元素buf[1]的值

	printf("%d %d\n",*(p+2),*(buf[1]+2));	//*(p+2) and *(buf[1]+2) 都表示数组中下标为2的值

}

三,数组指针

1,概念

        是⼀个指针,存储地址,⽤于存储整个数组的地址,指针的类型为数组地址 类型,指向整个数组

2,定义

        数组元素类型 (* 指针名) [数组⼤⼩]

        举例说明: int (*p) [5]   代表着定义了整型的,数组大小为5的数组指针。

3,实例示范

#include<stdio.h>
int main()
{
	int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10}};
	
	int (*p)[4];	//数组指针的定义,表示定义一个存储整型的数组元素为四的地址
	p=a;		//代表存储a[0]这个一维数组的地址。它等价于 *p
	p+1;		//代表的含义为存储一维数组下标索引为1的地址。 它等价于 *(p+1)
	**p;		//代表着二维数组a[0][0]的地址中存储的值。
	*(*(p+1));	//代表着二维数组a[1][0]的地址中存储的值。
	*(*(p+1)+1);	//代表着二维数组a[1][1]的地址中存储的值。
	
	
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<4;j++)
		{
			printf("%d ", *(*(p+i)+j) );
		}
	printf("\n");
	}
	
	
	
	
}

四,指针数组

        1,概念

                指针数组就是⼀个数组,但是数组的每个元素是⼀个指针。

        2,定义

                数据类型  * 数组名 [数组⼤⼩]

                例如:int   * a [10]

        3,举例说明

                

#include<stdio.h>
int main()
{
	int a=1,b=2,c=3,d=4;
	
	int buf[10]={1,2,3,4,5,6,7,8,9,10};
	
	int *p[4];	//代表着定义了一个整型的指针数组
	
	p[0]=&a;	//代表存储a的地址
	
	p[1]=&b;
	
	p[2]=buf;	//代表存储数组中首地址
	
	p[3]=buf+2;	//代表存储数组下标为4的地址;
	
	*p[0]=5;
	*p[1]=7;
	*(p[2]+2)=10;
	*p[3]=12;
	
	for(int j=0;j<10;j++)
	{
		printf("%d ", buf[j] );
	}
	printf("\n");	
}

五,多级指针

        1,概念

         指针变量是存储地址的,但是由于指针变量本身也要占用空间,所以指针变量也会有地址,倘若另外的指针变量存储的是这个指针变量的地址,把另外的指针变量叫做二级指针。

        多级指针:

        ⼀级指针变量存普通数据类型的地址,

        ⼆级指针变量存⼀级指针变量的地址,

        三级指针变量存⼆级指针变量的地址

        2,定义

        

int * p1;
pi = &a;    //p1存储的是a的地址。

int * *p2 = & p1;    //p2存储的是p1的地址。

int * * *p3 = &p2;    //p3存储的是p2的地址也就是存储的p1的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值