精华内容
下载资源
问答
  • C语言二维数组初始化和作为形参的设定细节

    1、int二维数组初始化方式

    int A[2][3] = {1, 2, 3, 4, 5, 6};
    对应顺序是
    A[0][0]=1; A[0][1]=2; A[0][2]=3;
    A[1][0]=4; A[1][1]=5; A[1][2]=6;
    
    int A[2][3] = {1, 2, 3, 4};
    其中剩余的未赋值元素编译器自动初始化为0。
    数组元素值对应顺序是
    A[0][0]=1; A[0][1]=2; A[0][2]=3;
    A[1][0]=4; A[1][1]=0; A[1][2]=0;
    
    int A[2][3] = {{1, 2, 3}, {4}};
    其中剩余的未赋值元素编译器自动初始化为0。
    数组元素值对应顺序是
    A[0][0]=1; A[0][1]=2; A[0][2]=3;
    A[1][0]=4; A[1][1]=0; A[1][2]=0;
    
    int A[][3] = {{1, 2, 3}, {4}};
    省略行数,切记列数无法省略。其中剩余的未赋值元素编译器自动初始化为0。
    数组元素值对应顺序是
    A[0][0]=1; A[0][1]=2; A[0][2]=3;
    A[1][0]=4; A[1][1]=0; A[1][2]=0;
    

    2、char二维数组初始化方式

    char A[2][3] = {'a', 'b', 'c', 'd'};
    其中未初始化的部分,编译器自动初始为'0'NULL)。
    printf("%s\n", A);
    输出"abcd"
    
    char A[2][3] =  {{'a'}, {'d', 'e', 'f'}};
    其中未初始化的部分,编译器自动初始为'0'NULL)。
    printf("%s\n", A);
    输出"a",输出第一行时遇到结束符导致停止输出。
    
    char A[2][3] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}};
    printf("%s\n", A);
    输出"abcdef"
        
    char A[][3] = {{'a', 'b'}, {'d'}};
    省略行数,切记列数无法省略。
    printf("%s\n", A);
    输出"ab"
    

    3、二维数组作为形参

    想要在函数中传递一个一维数组作为参数,必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针

    方式1,形式参数是一个指针
    void myFunction1(int *param)
    
    方式2,形式参数是一个已定义大小的数组
    void myFunction2(int param[10])
    
    方式3,形式参数是一个未定义大小的数组
    void myFunction3(int param[])
    
    int param[3] = {0};
    myFunction1(param);
    myFunction2(param);
    myFunction3(param);
    int *param2;
    myFunction1(param2);
    myFunction2(param2);
    myFunction3(param2);
    

    就函数而言,一维数组作为形参时的长度是无关紧要的,因为 C 不会对形式参数执行边界检查。

    同样的方式也可以传递一个多维数组作为形式参数?

    方式1,形式参数是一个指针
    void myFunction1(int **param)
    
    方式2,形式参数是一个已定义大小的数组
    void myFunction2(int param[2][10])
    void myFunction2(int param[2][3])
    
    方式3,形式参数是一个未定义一维宽度的数组
    void myFunction3(int param[][3])
    
    方式4
    void myFunction4(int (*a)[3])
    
    方式5
    void myFunction5(int *a[3])
    
    int param[2][3] = {0};
    myFunction1(param);
    错误,[Error] cannot convert 'int (*)[3]' to 'int**' for argument '1' to 'void myFunction(int**)'int param[2][3]中param其实是"int (*)[3]"类型,不是"int**"类型,这两者不能混用
    myFunction2(param);
    二维宽度为10的错误,[Error] cannot convert 'int (*)[3]' to 'int (*)[10]' for argument '1' to 'void myFunction2(int (*)[10])',可以理解为"int (*)[3]""int (*)[10]"不是一种类型
    为3的正确,二维数组作为函数形参会进行边界检查,所以第二个维度必须一致
    myFunction3(param);
    myFunction4(param);
    myFunction5(param);
    错误,注意如果是int *a[3],因为"[]"的优先级比"*"高,所以会导致该形参被编译器识别为"int**"
    
    int **param2 = (int **)malloc(sizeof(int *) * 2);
    myFunction1(param);
    myFunction2(param);
    myFunction3(param);
    myFunction4(param);
    myFunction5(param);
    只有myFunction1和myFunction5正确,其余的形参都不是"int**"类型
    注意myFunction5中的"a[3]"类似一维数组作形参的效果,不管数组大小都被当作"int *"
    

    4、综合例子

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 二维数组作为函数的形式参数会进行边界检查,所以第二个维度必须为5 
    void example(char acHello[][5])
    {
    	printf("%d\n", sizeof(char (*)[5])); // 输出8
    	printf("%d\n", sizeof(acHello)); // 输出8,为sizeof(char (*)[5]),指针为8 
    	printf("%d\n", strlen(acHello[0])); // 输出9,因为acHello[0]并没有'\0'结束符,所以是acHello的总长度 
    	acHello[0][0] = 'c';
    	return;
    }
    
    int main(void)
    {
    	char str[] = "\\\\";
    	printf("%d\n", sizeof(str)); // 输出3,\\其实是转义,所以2个'\'加字符串自带的1个'\0'是3 
    	printf("%d\n", strlen(str)); // 输出2,即2个'\' 
    	
    	char *str2 = "\\\\";
    	printf("%d\n", sizeof(str2)); // 输出8,str是char*类型的指针,指针在64位下都是8 
    	printf("%d\n\n", strlen(str2)); // 输出2,即2个'\' 
    
    	char str3[2][3] = {"qw", "er"};
    	printf("%c ", *(*(str3 + 0) + 0));
    	printf("%c ", *(*(str3 + 0) + 1));
    	printf("%c ", *(*(str3 + 1) + 0));
    	printf("%c\n", *(*(str3 + 1) + 1));
    
    	printf("%c ", *(str3[0] + 0));
    	printf("%c ", *(str3[0] + 1));
    	printf("%c ", *(str3[1] + 0));
    	printf("%c\n", *(str3[1] + 1));
    
    	printf("%c ", str3[0][0]);
    	printf("%c ", str3[0][1]);
    	printf("%c ", str3[1][0]);
    	printf("%c\n\n", str3[1][1]);
    	// *(str3 + 0)等效于str3[0],*(*(str3 + 0) + 0)等效于str3[0][0] 
    
    	char *szStr = "abcde";
    	printf("%c\n", szStr[0]); // 输出a 
    	printf("%llu\n", szStr); // 输出4210713,该值为"abcde"这个常串中字符a所在的地址
    	szStr += 2;
    	printf("%c\n", szStr[0]); // 输出c 
    	printf("%llu\n\n", szStr); // 输出4210715,该值为"abcde"这个常串中字符c所在的地址
    
    	char dqq[][10] = {{'h', 'e', 'l', 'l', 'o'}, {'q', 'w', 'e'}};
    	printf("%s\n", dqq); // 输出hello,因为第一维多的部分被自动初始化为'\0',所以输出的时候截断了 
    	printf("%s\n", dqq[1]); // 将第二维输出,所以是输出qwe
    	printf("%c\n\n", dqq[1][0]); // 输出q
    
    	char acHello[][5] = {{'h', 'e', 'l', 'l', 'o'}, {'h', 'e', 'l', 'l'}};
    	example(acHello);
    	printf("%s\n\n", acHello); // 输出cellohell,由于是传的指针,所以第一个字符被修改为c
    
    	return 0;
    }
    
    展开全文
  • ![图片说明](https://img-ask.csdn.net/upload/201711/06/1509937541_702321.png) ``` #include #include int main() { int i; char s[2][5]={"12345","12345"}; for(i=0;i;i++) { printf("%s\n",s[i]);...
  • c语言二维数组初始化的方式

    万次阅读 2017-05-17 23:02:28
    #include #include int main() { int **arr; int m=3,n=4,i,j; arr = (int **)malloc(sizeof(int*)*m); for(i=0; i; i++) arr[i] = (int *)malloc(sizeof(int)*n);
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int **arr;
        int m=3,n=4,i,j;
        arr = (int **)malloc(sizeof(int*)*m);
        for(i=0; i<m; i++)
            arr[i] = (int *)malloc(sizeof(int)*n);
    
        for(i=0; i<m; i++)
            for(j=0; j<n; j++)
                arr[i][j] = i*10+j;
    
        for(i=0; i<m; i++)
        {
            for(j=0; j<n; j++)
            {
                printf("%d ",arr[i][j]);
            }
            printf("\n");
        }
    
        for(i=0; i<m; i++)
            free(arr[i]);
    
        free(arr);
        return 0;
    }
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int m=3,n=4,i,j;
        int *storage;
        int **matrix;
        storage = (int *)malloc(sizeof(int) * m*n);
        matrix = (int **)malloc(sizeof(int *) * m);
        for(i=0; i<m; i++)
            matrix[i] = &storage[i*n];
    
        for(i=0; i<m; i++)
            for(j=0; j<n; j++)
                matrix[i][j] = i*10+j;
    
        for(i=0; i<m; i++)
        {
            for(j=0; j<n; j++)
                printf("%d ", matrix[i][j]);
            printf("\n");
        }
    
        free(storage);
        free(matrix);
        return 0;
    }
    展开全文
  • c语言二维数组如何初始化1 有两种方法(1)在定义时可以直接赋值来初始化(2)在定义后可以为其元素一个个来赋值2 示例1234567891011121314151617181920212223242526272829#include《stdio.h》void display(int arr[2]...

    c语言二维数组如何初始化

    1 有两种方法

    (1)在定义时可以直接赋值来初始化

    (2)在定义后可以为其元素一个个来赋值

    2 示例

    1234567891011121314151617181920212223242526272829#include《stdio.h》

    void display(int arr[2][3], int row, int col){

    for (int i = 0; i 《 row; i++){

    for (int j = 0; j 《 col; j++){

    printf(“%d ”, arr[i][j]);

    }

    puts(“”);

    }

    puts(“”);

    }

    int main(){

    //方法(1)

    int arr1[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };

    //方法(2)

    int arr2[2][3];

    int num = 1;

    for (int i = 0; i 《 2; i++){

    for (int j = 0; j 《 3; j++){

    arr2[i][j] = num++;

    }

    }

    display(arr1, 2, 3);

    display(arr2, 2, 3);

    getchar();

    return 0;

    }

    3 运行结果

    559e5dc5e78bc08067527ee24d072944.png

    由结果可知,两种方式达到的效果是一样的

    4 扩展

    由于C语言中数组中的元素的地址是连续的,所以下面的写法也是可以的,运行效果同上

    12345678910111213141516171819202122232425262728#include《stdio.h》

    void display(int arr[2][3], int row, int col){

    for (int i = 0; i 《 row*col; i++){

    for (int j = 0; j 《 col; j++){

    printf(“%d ”, arr[i][j]);

    }

    puts(“”);

    }

    puts(“”);

    }

    int main(){

    //方法(1)

    int arr1[2][3] = { 1, 2, 3, 4, 5, 6 };

    //方法(2)

    int arr2[2][3];

    int num = 1;

    int *p = *arr2;//指向数组的第一个元素

    for (int i = 0; i 《 2 * 3; i++){

    *p++ = num++;

    }

    display(arr1, 2, 3);

    display(arr2, 2, 3);

    getchar();

    return 0;

    }

    展开全文
  • 我要初始化一个二维数组为0,有以下几种方法: int arr[4][4] = {}; int arr[4][4] = {{0}}; int arr[4][4] = {0}; 第一种和第二种编译器不会报错,而第三种就会出警告,有朋友可以解答一下吗?不胜感激!
  • 许多c语言书中,很少谈到如何用malloc动态初始化一个二维数组。下面,我写了一段代码,要动态初始化二维数组。#include#include int** test(int m, int n) {int** a=(int**)malloc(sizeof(int*)*m);int i;for (i=0;i...

    许多c语言书中,很少谈到如何用malloc动态初始化一个二维数组。下面,我写了一段代码,要动态初始化二维数组。

    #include

    #include

    int** test(int m, int n) {

    int** a=(int**)malloc(sizeof(int*)*m);

    int i;

    for (i=0;i

    *(a+i) = malloc(sizeof (int)*n);

    }

    int j=0;

    int k=0;

    for (i=0;i<5;i++) {

    for (j=0;j<5;j++) {

    *(*(a+i) +j)=k++;

    }

    }

    return a;

    }

    void release(int **p, int m) {

    int i=0;

    for (i=0;i

    free(*(p+i));

    }

    free(p);

    }

    int main() {

    int** a = test(5,5);

    int i;

    release(a, 5);

    for (i=0;i<5;i++) {

    printf("%d\n", a[i][4]);

    }

    } 以上代码中,有申请空间的,有release的。

    展开全文
  • 本节学习二维数组二维数组与一维数组相似,但是用法上要比一维数组复杂一点。后面的编程中,二维数组用得很少,因为二维数组的本质就是一维数组,只不过形式上是二维的。能用二维数组解决的问题用一维数组也能解决...
  • C语言课件二维数组解析,c语言二维数组,c语言二维数组初始化,c语言二维数组定义,c语言二维数组传参,c语言二维字符串数组,c语言二维数组鞍点,c语言动态二维数组,c语言二维数组赋值,c语言二维数组指针§11 二维数组的...
  • 描述c语言二维数组如何初始化1 有两种方法(1)在定义时可以直接赋值来初始化(2)在定义后可以为其元素一个个来赋值2 示例1234567891011121314151617181920212223242526272829#include《stdio.h》void display(int arr...
  • 二维数组初始化

    2020-06-22 10:08:57
    二维数组初始化 (1)二维数组的初始化 int a[ ][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} ; int a[3][4]={ {1,2,3},{4,5,6},{7,8,9},{10,11,12} } ; 这三者赋值方式等价; 这...
  • 二维数组初始化规则

    万次阅读 多人点赞 2018-03-27 14:24:16
    二维数组初始化的形式为: 数据类型 数组名[整常量表达式][ 整常量表达式]={ 初始化数据 }; 在{ }中给出各数组元素的初值,各初值之间用逗号分开。把{ }中的初值依次赋给各数组元素。 有如下几种初始化方式: ...
  • ``` #include using namespace std;... 这样做是不是不是初始化,因为我已经动态分配了内存,已经创建了数组,所以a[3][3]= {{6, 1, 1}, {4, -2, 5}, {2, 8, 7}};是赋值多个值到一个数组元素a[3][3]
  • c++二维数组初始化

    千次阅读 2020-03-15 16:43:06
    (c/c++定义二维数组初始化) C语言规定,普通数组没有赋初值,默认的数组元素值是随机数,不是0。 如果在定义数组时,数据类型前面加上关键字static,数组变成了静态数组;或者把数组定义在函数的外面,成为全局变量...
  • C语言二维数组初始化的几种方式介绍1、直接赋值2、循环对每个元素赋值3、借用memset/memset_s初始化为0或-14、`数组所有元素初始化为相同值` 1、直接赋值 适合数组元素较少的,各元素的值可以不同。 int[2][3] arr...
  • C 语言支持多维数组。多维数组声明的一般形式如下:...二维数组多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:type arrayName [ x...
  • 二维数组初始化和找最大值二维数组初始化二维数组找最大值 二维数组初始化 我们先看一维数组初始化 这是一个一维数组, 里面的每一个元素,都是一个基本类型 int int a[] =new int[]{1,2,3,4,5}; 接下来看二维数组...
  • c语言二维数组如何初始化1 有两种方法(1)在定义时可以直接赋值来初始化(2)在定义后可以为其元素一个个来赋值2 示例1234567891011121314151617181920212223242526272829#include《stdio.h》void display(int arr[2]...
  • java之二维数组初始化

    2019-11-21 21:16:49
    package libai; public class meihua { public static void main(String[] args) { // TODO Auto-generated method stub char a[][]=new char[4][]; //数组初始化 a[0]=new char[]{'云','想','衣'...
  • C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。数组的声明并不是声明一个个单独的变量,比如 number0、number1、......
  • 二维数组初始化的形式有?

    千次阅读 2017-07-14 16:30:51
    二维数组初始化的形式有?
  • 一维数组,二维数组初始化

    千次阅读 2017-03-26 20:51:02
    1 static int a[10]={0,1,2,3,4,5,6,7,8,9};...经过上面的定义和初始化后,a[0]=0,a[1]=1,…,a[9]=9。 (2)初始化时可以只对一部分元素赋初值。例如: 1 static int a[10]=
  • 维数组1、定义:是一组具有相同数据类型的有序元素集合。2、初始化:(1)、初始化方式一://数组的定义:int a[length]; //这是数组的定义//可以使用for循环进行遍历初始化for (int i = 0; i < length; i++) {a...
  • 冒泡排序算法 本次课内容 掌握二维数组的定义、初始化掌握二维数组的定义、初始化 掌握二维数组的存储及应用掌握二维数组的存储及应用 掌握掌握选择排序的算法选择排序的算法 教材对应教材对应P106113P106113 4 二维...
  • JAVA二维数组初始化

    2019-10-31 21:24:06
    * 测试二维数组 * @author ZY * */ public class Test2DimensionArray { public static void main(String[] args) { int[][] b=new int[3][]; //二维数组 //赋值方法一 b[0]=new int[] {20,...
  • C语言二维数组元素的初始化

    千次阅读 2019-10-04 07:26:25
    二维数组的4种数组初始化: 一、直接分行给二维数组赋初值 例: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,...
  • memset函数为二维数组初始化

    万次阅读 2018-05-28 17:38:13
    1int* a; a = new int[10];sizeof(a) 只会返回出来指针的大小,所以我们只能自己计算这个数组的长度,这里应当是sizeof(int) * 10,...//将a数组初始化为02 int **p;//开一个n*m的数组 p = new int*[n]; for (int i = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 101,652
精华内容 40,660
关键字:

c二维数组初始化