天天看点

C语言学习大纲--数组与指针

专题五:数组与指针    

1.     数组的定义和初始化

        int a[] ={1, 2, 3} //定义一个长度为3的int类型的数组,并初始化为1, 2, 3

        char b[10] ={0}; //定义一个长度为10的char类型的数组,并初始化为0

        char*str[10] = {0}; //定义一个长度为10的char*类型的数组,保存10个字符串的地址

        int  n; int  arr[n]; //定义一个变长数组

2.     数组的类型

        int  a[5] //变量a的类型为int [5]

        char  b[10] //变量b的类型为char [10]

        char* c[10]//变量c的类型为char* [10]

3.     数组的长度:sizeof(数组名)/sizeof(数组名[0])

        int  a[10]; //sizeof(a) / sizeof(a[0]), sizeof(int[10]) / sizeof(int)

4.     定义int arr[10],&arr, arr, &arr[0]三者的区别

         &arr:为数组arr的地址,即就是变量arr的地址,该类型为数组指针int (*)[10]

         arr:为数组的首地址,该类型为 int* const arr

         &arr[0]:为数组首元素的地址,该类型为 int*

         *(arr+1) =arr[1];

         arr+2 =&arr[2];

         *((int*)(&arr+1)-1)= arr[9]

5.     指针数组和数组指针

         指针数组:是一个数组,用来保存地址变量

         int* arr[10]//定义一个数组arr,保存十个int*类型的数据

         数组指针:是一个指针,用来指向一个数组

         int (*p)[10]//定义一个指针p, 用来指向一个长度为10的int类型的数组

         int arr[10];

         p =&arr;

6.     指针数组、二级指针和二维数组的区别

         int arr[10];

         int* p =arr; //p[0], *(p+1)

         int*arr[10];

         int** pp =arr //*arr[0]==**pp, *(*(arr+1))== *pp[1]

         int a1[3],a2[3], a3[3];

         int* b[3] ={a1, a2, a3} //int b[3][3]

7.     数组与字符串

        char str1[]= “hello world”;

        char* str2 =“welcome to tarena”;

        str1 = str2;//错误,str1为char* const类型的,为指针常量,是个常量

        str2 = str1;//正确,str2能指向任意类型的字符串

        str1[0] = ‘H’;//正确,str1指向了一块能修改的内存

        str2[0] = ‘H’;//错误,str2指向了一块只读的内存区域,因为字符串字面值保存在代码区,为只读区域

        sizeof(str1);//为12,应为sizeof(char [12]),包过’\0’字符

        strlen(str1);//为11,strlen函数求字符串大小不包过’\0’

        sizeof(str2);//为4,因为str2为char*类型,所以sizeof(char *) = 4

        strlen(str2);//为16

       注意:sizeof为运算符,strlen是库函数,sizeof是对数据类型求大小,strlen是求字符串的长度,不包过’\0’结束字符

8.  空指针(void*)

     (1)代表任意类型的指针

     (2)一切类型的指针都可以隐式转换为空指针

     (3)对空指针不能解引用

     (4)空指针支持计算,但是统一按单字节处理