C指针用法详解:从基础到高级

需积分: 10 3 下载量 52 浏览量 更新于2024-09-12 收藏 43KB DOCX 举报
"C指针用法总结" C语言中的指针是其强大特性的核心之一,它可以用来操作内存,实现动态数据结构,并提供高效的函数调用。本文将深入探讨C指针的一些关键概念和用法。 一、指针与数组的存储 1. 内存中的存储形式 数组在内存中分配连续的空间,数组名如`p[N]`是一个常量,表示数组的起始地址,不可更改。而指针`*p`则是在内存中分配一个用于存储地址的变量,它的值可以在程序运行时改变,取决于初始化情况。 2. 赋值与初始化 - 数组的地址不能改变,但内容可以修改。例如,`p=p+1`是非法的,而`p[0]=1`是允许的。 - 指针的值可以改变,它所指向的内容也可能被修改,但需要先进行初始化。例如,`p=p+1`是合法的,但未初始化的`p[0]=1`是不允许的。 - 对于字符指针,如`char *p="abc"`,由于字符串常量存储在只读区域,`p[0]='d'`会导致错误。而`char p[]="abc"`则允许修改,因为字符串常量被复制到数组的可变内存中。 二、指针表达式与多级指针 1. 多级指针 - `char *p, **p, ***p`: 这些表示单级、二级和三级指针,分别指向一个字符、一个指向字符的指针以及一个指向该指针的指针。 - `char p[], p[][], p[][][]`: 这些是数组声明,不是指针,但可以用来存放字符数组。 - `char *p[], *p[][], **p[], **p[][], *(*p)[], (**p)[], (**p)[][]`: 这些表达式涉及多维数组和指针的组合,其中`p[]`表示数组,`*p`表示指针,`**p`表示指向指针的指针。例如,`*p[]`表示一个指针数组,`**p`表示一个指向指针的指针,`(**p)[][]`则表示一个二维数组,每个元素都是一个指向指针的指针。 三、指针操作与动态内存 1. 动态内存分配:使用`malloc()`和`calloc()`函数可以动态分配内存,返回的内存地址可以赋值给指针,如`int *p = malloc(sizeof(int) * 5)`。使用完后需用`free()`释放内存。 2. 函数参数传递:通过指针作为函数参数,可以实现对原变量的修改,如`void swap(int *a, int *b)`可以交换两个整数的值。 四、指针与数组的关系 指针和数组在很多情况下可以互换使用,如`*p`可以视为数组的首元素,`p[i]`等同于`*(p+i)`。这使得指针可以遍历数组,执行类似数组的操作。 总结,C语言的指针是一个强大的工具,但也需要谨慎使用,避免出现悬挂指针、内存泄漏等问题。理解和熟练掌握指针的用法是成为C语言高手的关键步骤。在实践中不断探索和练习,才能更好地驾驭这个编程语言的核心特性。