C语言——二维数组、指针

目录

一、二维数组

1.定义:类型 数组名[常量表达式][常量表达式]

2.二维数组的访问 

3.二维数组的初始化

二、指针(*) 

1.指针和指针变量

2.定义指针变量:类型名 *指针变量名

3.取地址运算符和取值运算符


一、二维数组

1.定义:类型 数组名[常量表达式][常量表达式]

  • int a[6][6];// 6*6,6行6列
  • char b[4][5];// 4*5,4行5列
  • double c[6][3];// 6*3,6行3列

2.二维数组的访问 

  •  数组名[下标][下标]

如:

a[0][0];//访问a数组中第1行第1列的元素

a[1][3];//访问a数组中第2行第4列的元素

a[3][3];//访问a数组中第4行第4列的元素

  • 同样需要注意下标的取值范围,以防数组的越界访问。

如:int a[3][4];其“行下标”的取值范围是0-2。“列下标”的取值范围是0-3,超出任何一个下标的访问都是越界访问。

3.二维数组的初始化

(1)由于二维数组在内存中是线性存放的,因此可以将所有的数据写在一个花括号内:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

代码举例:

#include <stdio.h>

int main()
{
	int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
	int i,j;
	
	for(i = 0;i < 3; i++)
	{
		for(j = 0;j < 4;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
	
}

运行结果:

(2)为了更直观地表示元素的分布,可以用大括号将每一行的元素括起来:

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

或者:

int a[3][4]={
    {1,2,3,4},
    {5,6,7,8},
    {9,10,11,12}
};

(3)二维数组也可以仅对部分元素赋初值:

int a[3][4]={{1},{5},{9}};

代码举例:

#include <stdio.h>

int main()
{
	int a[3][4] = {{1},{5},{9}};
	int i,j;
	
	for(i = 0;i < 3; i++)
	{
		for(j = 0;j < 4;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
	
}

运行结果:

 (4)如果希望整个二维数组初始化为0,那么直接在大括号里写一个0即可:

int a[3][4]={0];

若没有对其进行初始化,则读出的值是随机的,如下:

#include <stdio.h>

int main()
{
	int a[3][4];
	int i,j;
	
	for(i = 0;i < 3; i++)
	{
		for(j = 0;j < 4;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
	
}

运行结果:

 (5)C99同样增加了一种新特性:指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为0:

int a[3][4] = {[0][0] = 1,[1][1] = 2,[2][2] = 3};

代码举例:

#include <stdio.h>

int main()
{
	int a[3][4] = {[0][0] = 1,[1][1] = 2,[2][2] = 3};
	int i,j;
	
	for(i = 0;i < 3; i++)
	{
		for(j = 0;j < 4;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
	
}

运行结果:

 (6)二维数组的初始化也能价懒,让编译器根据元素的数量计算数组的长度。但只有第1维的元素个数可以不写,其他维度必须写上:

int a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

4.代码实战:录入下表的成绩,并实现矩阵转置

代码如下:

#include <stdio.h>

int main()
{
	int a[4][5] = {
	
	{80,92,85,86,99},
	{78,65,89,70,99},
	{67,78,76,89,99},
	{88,68,98,90,99}
	};
	
	//录入成绩 
	int i,j;
	
	for(i = 0;i < 4; i++)
	{
		for(j = 0;j < 5;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	printf("\n");

	//矩阵转置
	for(i = 0;i < 5; i++)
	{
		for(j = 0;j < 4;j++)
		{
			printf("%d ",a[j][i]);
		}
		printf("\n");
	}
	
	return 0;
	
}

运行结果:

二、指针(*) 

1.指针和指针变量

  • 通俗讲,指针就是地址的意思。C语言中有专门的指针变量用来存放指针,它跟普通变量又不同,指针变量存放的是地址,而普通变量存放的是数据。
  • 指针变量有类型,它的类型就是存放的地址指向的数据类型

2.定义指针变量:类型名 *指针变量名

  • char *pa;//定义一个指向字符型的指针变量
  • int *pb;//定义一个指向整型的指针变量

3.取地址运算符和取值运算符

  • 如果需要获取基个变量的地址,可以使用取地址运算符(&):
char *pa=&a;
int *pb=&f;
  • 如果需要访问指针变量指向的数据,可以使用取值运算符(*):
printf("%c,%d\n", *pa, *pb);

代码举例:

#include <stdio.h>

int main()
{
	char a = 'F';
	int f = 123;
	
	char *pa = &a;
	int *pb = &f;
	
	printf("a = %c\n", *pa);
	printf("f = %d\n", *pb);
	
	*pa = 'C';
	*pb += 1;
	
	printf("now,a = %c\n", *pa);
	printf("now,f = %d\n", *pb);
	
	printf("the addr of a is : %p\n", pa);
	printf("the addr of b is : %p\n", pb);
	
	return 0;
}

运行结果:

注意:要避免访问未初始化的指针!!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值