【C语言】指针数组和多维数组

数组:一块连续的空间,存放相同数据类型的数据。
指针数组:就是一个数组,数组里的元素是指针。
多维数组:也是一个数组,数组里的元素是数组。

情景再现
我们知道

char * str = "hello";

这里用的是64位操作系统:

str是一个指针,指向一个字符串,字符串里面的内容是hello。
一个指针所占内存是8个char类型的大小,也就是8个字节(Byte)。
"hello"字符串有5个字母,每个字母占一个char,另外末尾其实有一个’\0’的结尾符,也在一个char。所以一般字符串大小是字符串的能看到的长度(ASCII码里的字符)+ 一个’\0’的大小。这里就是6个字节(Byte)。
用sizeof运算符

#include <stdio.h>
int main()
{
	char* str = "hello";
	printf("str pointer length : %d\nstr length:%d\n", sizeof(str), sizeof("hello"));
	printf("other pointer length :%d ,%d\n", sizeof(int*), sizeof(double*));
}

在这里插入图片描述

一个char* p可以存一个字符串,那么需要更多的字符串,就要声明更多的指针。

char * str = "hello";
char * str2 = "nice";
char * str3 = "ok";
...

这样很累,是不是。

所以就有了指针数组。

char* str_arr[]={
	"hello",
	"nice",
	"ok"
};

当然也可以这样

char* p = "uu";
char* str_arr[]={
	p,
	"hello",
	"nice",
	"ok"
};

怎么访问呢?

#include <stdio.h>
int main()
{
	char* p = "ux";
	char* str_arr[] = {
		p,
		"hello",
		"nice",
		"ok"
	};
	// 下标方式访问 数组名[下标]
	printf("%s\n", str_arr[0]);
	printf("%s\n", str_arr[1]);
	printf("%s\n", str_arr[2]);

	// 指针方式访问 *(数组名+指针移动量)
	printf("%s\n", *str_arr);
	printf("%s\n", *(str_arr+3));
}

在这里插入图片描述

对应字符串里的字符怎么访问呢?

// 方式1 数组+数组
printf("%c\n", str_arr[0][0]);
printf("%c\n", str_arr[0][1]);
printf("========\n");

// 方式2 数组+指针
printf("%c\n", *str_arr[0]);
printf("%c\n", *(str_arr[0]+1));
printf("========\n");

// 方式3 指针+数组
printf("%c\n", (*(str_arr + 2))[0]);
printf("%c\n", (*(str_arr + 2))[1]);
printf("========\n");

// 方式4 指针+指针
printf("%c\n", *(*(str_arr + 3)));
printf("%c\n", *((*(str_arr + 3))+1));
printf("========\n");

一般来说指针数组的大小等于,数组里元素的个数x指针的大小(8Byte)
每个指针指向的空间大小不一样,加起来就是
∑ i = 0 n n i \sum_{i=0}^nn_i i=0nni,其中 n i n_i ni为指针指向内存块的大小。
所以一共需要 ∑ i = 0 n n i \sum_{i=0}^nn_i i=0nni+ ∑ i = 0 n 8 n \sum_{i=0}^n8n i=0n8n字节。

多维数组
最容易想到的就是矩阵
( 1 2 3 4 5 6 7 8 9 ) \left( \begin{array}{lcr} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{array} \right) 147258369

int m1[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

怎么访问呢?

// 第一种
printf("%d\n", m1[1][1]);	// 5
// 第二种
printf("%d\n", m1[0][4]);	// 5
// 第三种
printf("%d\n", (*m1)[4]);	// 5
// 第四种
printf("%d\n", *(*m1+4));	// 5
// 第五种
printf("%d\n", *(m1[0])+4);	// 5
printf("%d\n", *(m1[2])-2);	// 5
// 第六种
printf("%d\n",*(*m1+4));	// 5

在这里插入图片描述

下面是内存占用分析
拿二维的举例,一般都类似这种 int a[3][4]; float b[4][5];
抽象一下 T x[n][m]
元素个数 n ∗ m n*m nm
T大小sizeof(T)
所以总大小 n ∗ m ∗ s i z e o f ( T ) n*m*sizeof(T) nmsizeof(T)

!!!
这就是几种茴香豆里回字的几种写法了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值