C语言基础专题 - C的灵魂没了篇
本文介绍了C语言中指针及其用法
- 由于博主水平有限,疏忽在所难免。若发现错误请告知博主更正,十分感谢。
- 邮箱:291148484@163.com
- 希望博文对大家所有帮助!
1.🧐什么是指针?
答:指针是一个值为另一个变量的地址的变量。
以下是常识:
- 变量保存在内存中;
- 每个变量保存在内存中的位置成为变量的
内存地址
。
两个运算符:
- 取内容运算符
*
:与乘法的运算符是同一个符号,其后紧跟一个变量; - 取址运算符
&
:获取变量的地址,如&a
表示获取变量a的内存地址;
请通过代码理解:
#include <stdio.h> int main (){ int a; /* 声明整形变量 a */ int *pa = &a; /* 声明指针变量 pa 同时赋值为 a 的内存地址 */ a = 10; /* 变量 a 的内容赋值为10 */ printf("a:%d\n",a); /* 变量 a 的值 */ printf("&a:%x\n",&a); /* 变量 a 的地址 */ printf("pa:%x\n",pa); /* 指针变量自身存储的内容(为内存地址) */ printf("*pa:%d\n",*pa); /* 取指针变量 pa 存储的地址所指向的内容 */ printf("&pa:%x\n",&pa); /* 指针变量pa自己作为变量所存储的内存地址 */ }
运行结果
:
a:10 &a:62fe1c pa:62fe1c *pa:10 &pa:62fe10 -------------------------------- Process exited after 0.02328 seconds with return value 11 请按任意键继续. . .
程序说明:
int a
声明了一个整型变量a
,&a
用于获取变量a
的内存地址,这个地址一般是一个十六进制表示的数。int *pa
中,使用*
作用是声明为指针变量,指针变量一般存一个十六进制数。与普通变量存储数不同在于这个变量pa
存的值一般用于表示内存中的地址,因为它可以通过*pa
来获取这一块地址中所存储的内容。- 如上述,由于指针的内容是一个十六进制表示的内存单元的地址,因此我们往往是通过某中方法获取地址的,这里可能用到以下相关内容:
- 通过取址运算符 &a获取某个变量 a的内存地址
- 通过 malloc()函数申请动态分配内存空间,返回空间首地址
- 通过 free()函数四方不用的内存空间
不要混淆以下写法:
*p++; /* 先进行取内容 *p 操作,然后使得指针变量 p 加1,指向下一个位置 */ ++*p; /* 将 p 指向的变量的内容加1 */ *++p; /* 相当于 *(++p), 即先将指针变量 p 表示内存地址的数组加1,然后用取内容运算符 * 获取该内存地址中存储的内容 */
2.👨🏫指针与数组
2.1 数组赋值指针:
以下两个写法是等价的,
int a[99]; int *p p = a; /* 数组的首地址赋值给指针变量p */
和
int a[99]; int *p p = &a[0] /* 获取数组 a 首个元素的地址,再赋给指针变量 p */
这两种写法最后都有共同的效果,那就是,指针变量p指向数组a的首地址。因为数组中:数组名代表该数组的首地址的常量。
2.2 用指针访问数组
2.3 指针数组
指针数组指数组的所有元素都hi是存放指针的组数,其定义形式为:
<存储类型> <数据类型> <*指针数组名>[数组长][={地址列表}]
其中[数组长]
的[]
表示数组,而[={地址列表}]
的[]
表示可选部分,如
static int *p[5]
3.👨🏫指针与函数
3.1 函数指针
定义格式为:
<存储类型><数据类型> (*指针变量名)
3.2 指针函数
指针函数指的是返回指针的函数。
定义格式为:
<类型标识符> <*函数名> (参数表)
如:
int *f1(x, y)