IOS开发教程之C语言数组和字符串

2020-01-14 14:37:59刘景俊

再来看一下数组(注意不是数组的元素,是数组)作为参数传递的情况


#include <stdio.h>

void changeValue(int a[]){
  a[0] = 10;
}

int main(){
  int a[2] = {1,2};
  changeValue(a);
  for (int i = 0; i < 2; ++i){
    printf("a[%d]=%dn",i,a[i]);
  }
  /*打印结果
  a[0]=10
  a[1]=2
  */
}

多维数组

多维数组其实可以看成是一个特殊的一维数组,只是每个元素又是一个一维数组,下面简单看一下多维数组的初始化和赋值


#include <stdio.h>

int main(){
  int a[2][3];//2行3列,二维数组可以看成是一个特殊的一维数组,只是它的每一个元素又是一个一维数组
  a[0][0] = 1;
  a[0][1] = 2;
  a[0][2] = 3;
  a[1][0] = 4;
  a[1][1] = 5;
  a[1][2] = 6;
  for (int i = 0; i < 2; ++i){
    for (int j = 0; j < 3; ++j){
      printf("a[%d][%d]=%d,address=%xn", i, j, a[i][j], &a[i][j]);
    }
  }
  /*打印结果
  a[0][0]=1,address=f8fb24
  a[0][1]=2,address=f8fb28
  a[0][2]=3,address=f8fb2c
  a[1][0]=4,address=f8fb30
  a[1][1]=5,address=f8fb34
  a[1][2]=6,address=f8fb38
  */
  //初始化并直接赋值
  int b[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
  //由于数组的赋值顺序是先从第一行第一列,再第一行第二列...然后第二行第一列...,所以我们也可以写成如下形式
  int c[2][3] = { 1, 2, 3, 4, 5, 6 };
  //也可以只初始化部分数据,其余元素默认为0
  int d[2][3] = { 1, 2, 3, 4 };
  for (int i = 0; i < 2; ++i){
    for (int j = 0; j < 3; ++j){
      printf("d[%d][%d]=%dn", i, j, d[i][j]);
    }
  }
  /*打印结果
  d[0][0]=1
  d[0][1]=2
  d[0][2]=3
  d[1][0]=4
  d[1][1]=0
  d[1][2]=0
  */
  //当然下面赋值也可以
  int e[2][3] = { {}, { 4, 5, 6 } };
  //可以省略行号,但是绝对不可以省略列号,因为按照上面说的赋值顺序,它无法判断有多少行
  int f[][3] = { {1,2,3},{4,5,6} };
}

扩展--多维数组的存储

以上面a数组为例,它在内存中的结构如下图

IOS开发教程之C语言数组和字符串

根据上图和一维数组的存储,对于二维数组可以得出如下结论:数组名就是整个二维数组的地址,也等于第一行数组名的地址,还等于第一个元素的地址;第二行数组名等于第二行第一个元素的地址。用表达式表示: