一维数组和二维数组传参与易忽略知识点

  • int arr[3]数组类型,去掉arr就是它的类型:int [3],这里3不能掉,类型大小为12。如果是int [2],类型大小就是8.

  • 数组的内存是连续递增的
  • 数组的创建方式:
    type_t arr_name[const_n];
    ps:1.type_t是指数组的元素类型;
         2.const_n是一个常量表达式,用来指定数组的大小
         3.C99语法支持变常数组 --- 数组的大小是变量,但VS2019不支持C99语法

一维数组的初始化

char ch1[ ] = {'a', 'b', 'c');//打印结果为:abc烫烫烫
char ch2[ ] = "abc";//打印结果为:abc
ch1出现乱码,原因是:
ch2中,字符串会默认加上'\0',而ch1不会,所以它会一直往后打印,直到遇到'\0'.所以后面显示乱码
求数组长度时,strlen遇'\0'会停止,所以ch1的长度为一个随机值(因为你不知道内存的'\0'在哪里),ch2的长度为3

打印字符串的两种方法:
1.for循环
2.printf("%s",ch1);
   printf("%s",ch2);

二维数组的初始化(以下数组的行可以省略,但是列不能省略!):

  • int arr[3][4] ;
  • int arr[3][4] = { 0 };
  • int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10 };
  • int arr[3][4] = { {1,2},{3,4},{5,6} };//没有初始化的地方补0
  • int arr[3][4] = { {1,2},{},{5,6} };//第二行不进行初始化

三维数组也是能省略一维,二维与三维都不能省略。

将二维数组看为一维数组:
如果要找第三行的数据:arr[2],arr[2]即为第三行的数组名。

数组越界 --- 越界访问

数据越界时,编译器有时是不会访问的,因为数组地址是连续存放的,会打印数组后面的数

二维数组越界:不管是行和列,都有可能存在越界,但是二维数组行越界,使用的依然是自己内存里的数,即后面一片的数据,因为二维数组在内存中也是连续排列的。

数组名

数组名确实能表示首元素的地址,但是有两个例外(除此之外数组名都表示首元素的首地址):

  • 1.sizeof(arr)中,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
  • 2.&数组名,这里的数组名表示整个数组,取出来的是整个数组的地址
    所以传完参之后,只能int* p = arr ; p++; 如果:arr++就错了!因为arr一加跳过的就是整个数组!!!
    printf("%p\n", &arr[0]);
    printf("%p\n", arr);
    printf("%p\n", &arr);
    //区别:
    printf("%p\n", &arr[0]+1);
    printf("%p\n", arr+1);//这个和上面那个都是跳过4个字节,即arr元素类型的大小
    printf("%p\n", &arr+1);//此时是代表整个数组的地址,如果加1就是直接跳整个数组

二维数组的数组名的理解 

  • int a[3][4];
    sizeof(arr);//48个字节,此时表示整个二维数组的地址
  • &arr一样,也是表示整个二维数组的地址,如果+1,跳过的就是整个二维数组
  • arr;二维数组的数组名也表示整个数组首地址,此时需要想象成一维数组,此时表示的是arr[0]这一行的地址。

计算二维数组几行几列:

int row = sizeof(arr) / sizeof(arr[0]);//计算几行
int col = sizeof(arr[0]) / sizeof(arr[0][0]);//计算几列

一维数组传参

一维数组传参有两种方式:
1.char str[ ]//参数部分写出数组的形式
2.char* str[ ]//参数部分写出指针的形式

二维数组传参

假设二维数组int arr[m][n]

方法1: 

传参:

fun(arr);
//这里只能写数组名!
//(ps:) fun(a[m][n])或fun(a[][n])都不行!!!

接收:

arr[0]等价于 -->*(arr + 0)

fun (int arr[m][n])
//或者
fun (int (*arr)[n])
//ps:注意是int (*arr)[n]而不是int* arr[n]
//因为[]的优先级比*大

在函数操控元素:

1.  *(a[i]+j)    //代表第i行第j列
2. *(*(a+i) + j)  //代表第i行第j列
3.*((int *)a + i*n +j) //代表第i行第j列
//不管怎么样,a[i][j]不被允许。也是由编译器的寻址方式决定。

方法2:

传参:

fun((int **)a,int n);//此时实参就不能为数组名了

接收:

int fun((int **)a,int n);

在函数操控元素:  

*((int *)a + i*n +j) //代表第i行第j列
//不管怎么样,a[i][j]不被允许。也是由编译器的寻址方式决定。

易错 

二维数组传参无法从小数组传到大数组,数组中元素的个数只能填相应的个数 

但一维数组可以

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值