C99
- 指定初始化器: 指定初始化元素
int arr[6] = {
[5] = 5};
int arr[] = {
1, [5] = 4, 5, 6};
- output
tips:int arr[]
与int * arr
都表示arr
是一个指向int的指针,但是int arr[]
只能用于声明形式参数,函数原型中可以直接省略为int []
, 但函数定义中不能省略参数名
- 复合字面量(compound literal)
- 字面量:5是int型字面量,5.20是double型字面量,"No"是字符串字面量
- 复合字面量:数组的字面量(类似数组的初始化列表):(int [2]) {1, 2}
,可以作为实参传入函数:f((int [2]) {1, 2}, 2);
指针的注意事项
- 指针变量本质是地址,为什么还要带类型? 答:针代表指向一个变量,不仅需要知道它的地址,还需要知道所占的大小(字节),所以ptr++,是移动一个“单位”
- 不要解引用未初始化的指针(野指针(wild pointer))
const
tips:如果函数不用修改数组,最好加上const进行保护
const位置不同的指针区别:const int * ptr1;
& int * const ptr2
& const int * const ptr3;
const int * ptr1;
:指向const的指针,不能修改指向的内容,但可以修改所指的对象(可以改成指别人)
- code.
void func(int [], int);
int main(){
int a[3] = {
1, 2, 3};
const int b[3] = {
1, 2, 3};
const int * p1 = a;//RIGHT! tips 1
const int * p2 = b; //RIGHT! tips 1
int * p3 = b; //ERROR! tips 2
func(b, 3); //ERROR tips 3
return 0;
}
void func(int a[], int len){
for(int i = 0; i < len; ++i){
a[i] += 1;
}
}
tips 1:初始化时:指向const指针,既可以指向const数据也可以指向非const数据
tips 2:但是普通指针不能指向const数据,防止更改const数据内