C语言-基础知识学习(二)

本节主要讲下C语言中局部变量、全局变量、一维数组以及二维数组。

1.局部变量

局部变量的初始化:局部变量顾名思义是定义在函数内部的变量,作用域在函数内部,只有在函数内部可访问该变量。

初始化方式有两种:一是初始化不赋值 int a; ; 二是初始化赋值: int a=10;

注意:在初始化不赋值情况是当我们在栈上分配内存后,这时候的栈顶指针只是往下拨了相应的内存,并没有对内存进行初始化,所以当我们分配完内存地址后,内存里面是没有一个确定的数据值,例如 int a; ,这个时候栈顶指针往下拨了4个字节,然后用a来代表这个4个字节的内存,能够使用a来访问和存储内存的数据,这个时候的内存到底存的是什么,我们是不确定的,所以通常情况下,我们读取一个变量之前,需要对这个变量赋初始值。

2.全局变量

全局变量是相对局部变量而言的,首先定义在函数外部,所有的函数都能够访问到,而局部变量只能在函数内部访问。

初始化方式和局部变量相同: 类型:名称; 类型:名称 = 初始值;

全局变量的存储位置:全局变量不存储在代码段上,也不存储在栈上,二是操作系统专门给它开辟出的数据段上,这个数据段我们叫作DATA段。

特点:1.在程序进入main函数之前就已经分配好的,它一直占用内存,直到应用程序完全退出。分配的地方我们就叫作数据段,数据段是将我们的内存空间划分出来一个段。(操作系统将我们的内存划分出来一部分作为代码段;划分出一部分作为栈;划分出一部分作为数据段用来存储全局变量;剩下的部分就是我们的堆)。
2.所有的函数都能访问我们的全局变量;
3.分配全局变量的时候,如果我们没有对全局变量赋初始值,那么默认操作系统会给我们的全局变量里面所有的内存都清为0;
4.当我们的全局变量和我们的局部变量有冲突的时候,这个时候,我们的编译器会将这个名字映射到局部变量;编译器对于一个名字的处理,先找局部变量或参数,如果有那么就使用这个局部变量或参数,如果没有再到全局变量里面找,如果找到了就用全局变量,没找到就报错;

注意:我们的应用程序加载过程首先操作系统会将我们的应用程序加载到内存,然后会加在我们的数据段,分配好我们的全局变量,然后进入 main 函数的入口。

3.sizeof操作符

sizeof操作符是返回我们 变量 或 变量类型 所占的字节大小的一个运算。
例如:sizeof(int) 返回int类型所占字节的大小,也就是4和字节。

int a = 1;  
sizeof(a)

上面代码返回这个变量对应类型所占内存的大小,也就是int类型占字节大小即4个字节。

4.一维数组

数组是存储多个相同数据类型的数据的集合;

一维数组定义:通过一个标号就能够找到相应的存储数据;

一维数组的内存分布:数组定义在哪里,内存就分配在哪里;数组作为全局变量,那么它的内存就分配在数据段上;数组作为局部变量,内存就分配在栈上;

注意:操作系统给每个应用程序分配的栈的大小是固定的,如果栈的使用超过了范围,操作系统会结束这个应用程序(闪退),抛出栈溢出的错误(stack overflower);

数组的初始化:
1.手写初始化:如果只写 int a[] = {…} 初始化几个数据,数组元素的格式就是多少;
2.通过访问数组里的元素来赋值 数组名称[下标] 来访问 ; 下标可是常亮也可是变量
3.一定要注意数组的范围,不能越界访问,编译器不会报错,但运行的时候会出问题;

  int index = 2;
  int arr[3] = {100,200,300};
  arr[0] = 400;

  // 遍历一维数组
  for (int i = 0; i < 3; i ++) {
      arr[i] = i;
  }
  NSLog(@"%d",arr[index]);

数组内存大小的计算方法:

1.sizeof(数据类型) * 数据个数
2.sizeof(arr)

5.二维数组

二维数组:它是由行号和列号共同决定我们的元素。

定义一个二维数组:例如定义一个3行4列的int类型的二维数组 int[3][4] 即 数据类型 数组名称[行数][列数] 下标都是从0开始。

特点:
1.二维数组初始化:每一行每一行的初始化;
2.支持变量下标,同时要防止数组越界;
3.二维数组在内存中是一行一行存的;

 int array[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    NSLog(@"%d",array[1][3]);

    // 遍历二维数组
    for (int i = 0; i < 3; i ++) {
        for (int j = 0; j < 4; j ++) {
           NSLog(@"%d",array[i][j]);
        }
    }

这里说一下,本人是做iOS 开发的,所以代码也是在Xcode里面写的,所以看到NSLog不要惊讶哈。

猜你喜欢

转载自blog.csdn.net/ssy_1992/article/details/79738810