【C语言】8.二维数组,字符串,为什么指针要产生不同的门类

  • 二维数组初始化和一维数组相似,不过二维数组可以忽略行数(即首先个括号里的数字),但是非克忽视列数(即第二只括号里的数字)。因为咱们可以通过第二单括号中的数字与数组中一共的元素个数可以推论出行数,所以可以忽略列数。但是转头是免能够的,所以要是留意勿克忽视第二单中括号里的情节。

  • 二维数组的存顺序是按行存放的,先寄存第一行之要素,再存第2实行的元素。

  • 二维数组作为函数参数,在吃调函数吃未克收获该产生微行,需要经参数传入。(这或多或少同一维数组凡平等的,在三番五次组作为参数的过程被,会叫看是指针,即8独字节)

    void test(char cs[2][3])
    {
        int row = sizeof(cs);
        printf("row = %zu\n", row);
    }
    输出结果:
    row = 8
    

    但是二维数组作为函数参数,在被调函数惨遭是可以测算产生二维数组来些许排列的

    void test(char cs[2][3])
    {
        size_t col = sizeof(cs[0]);
        printf("col = %zd\n", col);
    }
    输出结果:
    col = 3
    

    从而当此总结一下:如果二维数组作为函数的参数,在传递的长河遭到受认为是指针,所以一旦当给调函数惨遭因故sizeof直接计算数组共有多少行总是会得8,因为数组被当做了指针。但是于为调函数着,如果我们之所以sizeof计算是数组的之一元素,那么一定给计算的是数组里的多次组,所以是得获可靠之列数的。

  • 字符串

    • 初始化
      1. char myString[9] = “hello”; //在内存中因为“\0”结束, \0
        ASCII码值是0
      2. char myString1[9] = {‘h’,’e’,’l’,’l’,’o’,’\0′};
      3. char myString2[9] = {‘h’,’e’,’l’,’l’,’o’, 0};
      4. char myString3[9] = {‘h’,’e’,’l’,’l’,’o’};
        //静态数组如果没有赋值默认就是0,0虽一定给\0

  • \0凡字符串的标志。

  • \0是字符串结束的标志。

  • “ “ 一定是字符串。

  • 字符串的精神是多次组,不过最后一个素的\0。(可以见到初始化里面第2,3,4例)

  • char myString4[] = {‘h’,’e’,’l’,’l’,’o’};
    不是字符串而是一般的数组。这和初始化里之第4长条形似,但是是例外的。初始化第4漫长之例子前面规定包含了9单因素,后面赋值了5只,相当给局部初始化,所以后面会自动补0,那么一定给有矣\0,所以是字符串;而在本例中,并无会见自行补充0,所以马上就算是一个不足为奇的数组。

  • 总结就是使想方便的落字符串,那么直接用””即可,比如:char
    myString[] =
    “hello”;如果想用字符数组来博取字符串,需要在结尾加上\0。

  • 字符串输出:

    1. char myString[] = “hello”;

      printf(“%s\n”, myString);

    2. 可是注意这个题材:

      char myString[] = {'h', 'e', 'l', 'l', 'o' '\0'};
      char myArray[] = {'j', 'o', 'y'};
      printf("myArray = %s\n", myArray);
      

      %s的实质是根据首地址逐个出口元素直到遇到\0。前面提高了变量寻址由良至小(Excel表相当给myArray在myString上面,地址比myString要聊),所以输出完myArray后尚未撞\0用会延续输出紧临的内存中之内容,即myString中之要素,直到遇到\0。所以结果也joyhello

  • 字符串输入:

    1. char ch[10];

      scanf(“%s”,ch);

      注意:

      • 针对一个字符串数组, 如果不做初始化赋值, 必须指定数组长度
      • ch最多存放由9独字符构成的字符串,其中最后一个字符的职务要预留字符串的末梢标示‘\0’当用scanf函数输入字符串时,字符串中不能够含有空格,否则将坐空格作为串的截止符。
  • 字符串数组:

    1. char myArray1[2][10] = { {‘h’,’e’,’l’,’l’,’o’,’\0′},
      {‘w’,’o’,’r’,’l’,’d’,’\0′} };
    2. char myArray2[2][10] = { {“hello”}, {“world”} };
    3. char myArray3[2][10] = { “hello”, “world” };

  • 指南针为什么要分类别

    • 在同等栽编译器环境下,一个指南针变量所占的内存空间是永恒的。比如,在16号编译器环境
      下,任何一个指南针变量都只有占8独字节,并无会见按所因为变量的色而改变。

    • 虽然有所的指针都不过占8单字节,但不同档次的变量却占有不同的字节数。

      一个int占用4个字节,一个char占用1个字节,而一个double占用8字节;

      今天仅仅出一个地址,我岂才能够领略要打这个地址开始往后看多少个字节的积存空间为,是4个,是1个,还是8单。

      从而指针变量需要其所对的数据类型告诉其如果顾多少只字节存储空间

    • 也就是说,如果无点名指针的品种,那么当指针指向一个变量的时刻,她从首地址开始,但是其不晓得啊时已,它不清楚如果拜访多少个存储空间。比如来一个char类型的变量,我于是一个指南针指为它,但是这指针我设置成int类型,这样一来这个指针就会见朝后拜四单字节的囤积空间,很醒目得的结果未是char类型应该获得的,所以只要分类别。