C语言学习笔记-8.指针

一、什么是指针

1.指针是存放另一个变量内存地址的变量

   指针型变量的长度为4个字节,32位

2.宏定义NULL,表示0

   良好的编程习惯:暂时不使用指针时,将其值设为NULL

3.指针定义后,若未被初始化,则其值为0xCCCCCCCC(Visual Studio中)

   若访问此地址,则程序崩溃

4.指针作用:对主函数中实参变量值进行修改

   例:void get(int *input) {

             scanf(“%d”, input);             //注意:不能写成&input

         }

二、指针与数组

1.指针的加减运算以数据元素为单位,而不是字节

   *(a + k)等价于a[k]          &a[k]等价于a + k

2.指针与数组的区别:数组是有存储空间的,能够存储数据

                              指针只能用来存地址,没有存储空间

3.动态数组:例:Scores = (int *)malloc(num * sizeof(int));

                        if(Scores == NULL)

                            goto Error;

  注意:malloc函数返回void类型空指针,故须强制类型转换

           需加入错误处理

           可使用数组下标法和指针法访问

  静态数组存储于栈帧中,动态数组存储于堆中

4.动态数组使用后需使用free(…);释放

5.指针数组:例:void main(int argc, char *argv[])

                        argc:存放参数个数(包括程序名), argv中元素是基类型为字符的数组

6.指向指针的指针

   例:void get(int **array) {

             *array = (int *)malloc(count * sizeof(int));

         …}

   将主调函数中的地址,传到被调用的函数中,那么形参和实参均为指针

   将被调用函数中的地址,传到主调函数中,那么形参和实参均为指向指针的指针(也可以采用函数返回值)

7.二维数组与指针

   在C语言中存放一个二维数组时,并不会存放二维表格,而是顺序存放,即一个接着一个存放

   a[i][j]:对应地址:a + k * sizeof(int),k = i * 每行元素个数 + j

   a[i]:一维数组,例:a[0] + 1指向a[0][1]

   a:指向固定长度的一维数组,每一步跨度为该数组长度,例:a + 1指向a[1]

8.若调用a[i][j]:

对一行操作:test1(a[i]);      test1中参数:int *pa 或 int pa[] 或 int pa[4]

对数组操作:test2(a);         test2中参数:int (*arr)[4] 或 int arr[][4] 或 int arr[3][4]

9.动态二维数组

   例:a = (int (*)[4])malloc(nRows * nCols * sizeof(int));

三、指针与字符串

1.字符’\0’的ASCII码为0

   注意:在定义字符数组时,须为’\0’预留一个数组元素的空间

2.如果用指针指向一个字符串常量,那么该指针中存放的是该字符串的首地址

3.数据段是编译器用来存放字符串常量的地方

   程序员不需要申请或释放它,且字符串常量一般是只读的

4.字符串的访问:整个字符串:str 或 p(指针)

                        某个字符:str[i] 或 *(p + i)

posted @ 2015-02-10 22:40  trj14  阅读(153)  评论(0编辑  收藏  举报