数组应用
一、数组初始化
1.1 格式
共两种格式:
char buf[32] = {0}; int buf[32] = {0};
适用于所有类型。
char buf[32] = "";
仅适用于char,相当于定义一个‘\0’的空串。
1.2 初始化为0
数组初始化为0的方法有如下三种:
1. 全局变量和静态变量初始化时会自动被设置为0。
#include <stdio.h> #include <string.h> //char cbuf[32]; // 全局变量 int main(int argc, char *argv[]) { int ret = 0, i = 0, j = 0; while(1){ char buf[32] = {0}; ret = scanf("%s", buf); printf("input bytes [%d]:%s\n", ret, buf); for(;j++<10;); printf("j=%d\n", j); static char cbuf[32]; // 静态变量 printf("\ninit buf==========\n"); for(i = 0; i < sizeof(cbuf); ){ printf("0x%x\t", cbuf[i]); if((++i)%5 == 0){printf("\n");} } printf("\n"); } return 0; }
2. 对于局部数组我们还有简写的初始化语法。如果一个数组被部分初始化,没有被初始化的元素会被自动设置为相应类型的0。这是编译器自动完成的。
如格式中提到的都是部分初始化:
char buf[32] = {0}; int buf[32] = {0}; char buf[32] = "";
注:部分初始化不一定都要初始化为0,但没有被初始化的元素自动设置为相应类型的0。
3. 程序初始化,包括for(;;)或memset()等。
参考:
1. 如何将数组初始化为全0?
二、二维数组和双重指针不等价
int **p与int p[10][10]不等价,**p并不是一个二维数组的指针,只不过是一个指向指针的指针。
两者内存分布不一样。
问题:cannot convert from 'double [10][10]' to 'double ** '
例如:double arry[5][10] = {0}; double** pp; pp=arry;
直接的赋值会提示错误:cannot convert from 'double [10][10]' to 'double ** '
参数传递
将二维数组作为二重指针传递时,只是将数组的头指针传递给了函数,函数不清楚指针的内部结构。
二维数组中的a[i][j]和双重指针中的a[i][j]的意思是不一样的。
二维数组中int a[10][10]中,a[i][j]指的是第i行第j列数元素。
双重指针中int **a中, a[i][j]指的是第i个存放int *指针所指向地址中的第j个元素。也就是*(*(a+i)+j)。