C语言指针的定义及基本使用

写在前面:学习的第一门语言是Java,之前对C也了解一点,也只是了解一点,在加上长时间没有接触了,基本就只会一个Hello World了 。现在由于准备升本考试,不得不从头开始学C 。这里从零开始,记录C语言学习点滴 。欢迎正在学习C语言的小伙伴一起学习,未来可期,一起加油!
指针是C语言中一个非常重要的概念,也是C语言的特色之一 。使用指针可以对复杂数据进行处理,能对计算机的内存分配进行控制,在函数调用中使用指针还可以返回多个值 。
地址和指针
地址和指针是计算机中的两个重要概念,在程序运行过程中,变量或者程序代码被存储在以字节为单位组织的存储器中 。在C语言中,如果定义了一个变量,在编译时就会根据该变量的类型给它分配相应大小的内存单元 。例如:假设int类型变量占 2 个字节,则需要分配 2 个字节的内存单元 。
计算机为了对内存单元中的数据进行操作,一般是按“地址”存取的,也就是说对内存单元进行标识编号 。假设如下有变量定义:
int x = 18, y = 24, z = 20;
因为int类型变量的存储长度为两个字节,因此假设C编译器将他们分配到地址为1000 ~ 1001、1002 ~ 1003和1004 ~ 1005的内存单元中 。如下图:
实际上就在程序中,通过变量名进行操作,如调用函数("%d", x),输出X的值20 。而程序执行时是将变量翻译为它所在的内存地址进行操作的,上述输出操作可以描述为:将X所在的内存地址1000 ~ 1001单元的内容按照整形格式输出 。一般以变量所在的内存单元的第一个字节的地址作为它的地址,如变量X的内存地址是1000,y的内存地址是1002,z的地址是1004 。变量X、y、z的内容分别为20、24、20 。
要注意区分内存单元的内容和内存单元的地址 。
在C程序中还有一种使用变量的方法,即通过变量的地址进行操作:用指针访问内存和操纵地址 。
假设在定义一个变量P,它位于2000单元,该单元中存放了变量X的地址1000,如下图:
此时,取出变量P的值1000,就可以访问内存1000单元,实现对变量X的操作,也就是说通过变量P,可以间接访问变量X 。
与直接使用变量X相比较,使用变量P访问变量X的过程实现了对变量X的间接操作 。这种专门用来存放变量地址的变量称为“指针变量”,简称指针 。
指针是用来存放内存地址的变量,如果一个指针变量的值是另一个变量的地址,给指针变量指向那个变量 。上面提到的P就是一个指针变量,它存放了变量X的地址,即指针变量P指向变量X 。
前面几篇多次看到把地址作为scanf()的输入参数的用法 。例如,函数调用scanf("%d", &n),把输入的值存储到变量n所在的内存单元里 。其中&n表示变量n的内存地址或存储位置 。这里&称为地址运算符,&是一元运算符,与其他一元运算符有同样的优先级 。
指针变量的定义
如果在程序中声明一个变量并使用地址作为该变量的值,那么这个变量就是指针变量 。定义指针变量的一般形式为:
*类型名 指针变量名;
类型名指定指针变量所指向变量的类型,必须是有效的数据类型,如:int,float,char等 。指针变量名是指针变量的名称,必须是一个合法的标识符 。

C语言指针的定义及基本使用

文章插图
int i, *p;
声明变量 i 是int型,变量 p 是指向int型变量的指针 。指针值可以是特殊的地址0,也可以是一个代表机器地址的正整数 。
指针声明符 * 在定义指针变量时被使用,说明被定义的那个变量是指针 。
指针变量用于存放变量的地址,由于不同类型的变量在内存中占用不同大小的存储单元,所以只知道内存地址,不能确定该地址上的对象 。因此在定义指针变量时,除了指针变量名,还需要说明该说明指针变量所指向的内存空间上所存放数据的类型 。如下: