- 数组与指针
- 指针:在进行指针的初始化时,主要有一下两种的区别:
- 指向非数组变量时:一下两种写法效果相同
- 指针:在进行指针的初始化时,主要有一下两种的区别:
//第一种
int a;
int *p = &a; //在初始化时另p指向int a的
*p = 1;
//第二种
int a;
int *p; //先定义一个指针p
p = &a; //再另其指向a
*p = 1;
- 在指向数组时:一下两种写法相同
int arr[6] = { 0 };
int *pa = arr; //初始化指针pa指向数组arr[6]的第一个元素
int *pb; //初始化指针pb
pb = arr; //令其指向arr[6]的第一个元素
- 但是不能写pa=&arr,因为&arr是一个指向数组的指针
- 数组:一下两点值得注意
- C语言中只有一维数组,元素可以为任意类型的对象,
- 除了确定数组的大小和获得指向该数组下标为0的元素的指针,其他队数组的操作实际上都是通过指针进行的
- 作为参数的数组
- C语言会自动将作为参数的数组声明转换为相应的指针声明
- 指针的赋值:将一个指针的值赋给另一个指针,其实是让两个指针指向了同一个内存区域
- 空指针:int *p=NULL为常规写法
- 边界计算:在C语言中的数组下标或者计数一般都从0开始,如果需要计数n次则计数到<=n结束
- 求值顺序:C语言中&&、||、?:和,存在规定的求值顺序
- &&只有在左侧值为1时进行右侧的求值,||只有在左侧值为0时进行右侧的求值
- 因此1<0&&a++;该句运行后a的值其实并没发生改变
- a?b:c只有在a计算出具体值后对b或c进行求值
- ,则是先计算左侧,后将结果舍弃,计算右侧的值
- &&只有在左侧值为1时进行右侧的求值,||只有在左侧值为0时进行右侧的求值
- 函数main的返回值:大多数C语言实现都是通过函数main的返回值来告知操作系统该函数的执行是否成功,典型的返回0为程序执行成功,返回非0为程序执行失败
本内容主要参考《C陷阱与缺陷》一书,内容为自己整理的笔记