C学习-基础:指针的基本概念、定义与引用
指针和指针变量的基本概念
内存及其地址
在程序运行之前就将程序和数据存入计算机内存。存储器中的一个字节称为一个内存单元,为了正确地访问这些内存单元,必须为每个内存单元编号。根据内存单元的编号即可准确地找到该内存单元。内存单元的编号叫做地址。
变量
变量的存储单元由程序分配,因此变量的地址不能人为确定,而要通过取地址运算符&获取
例如:&a、&b和&c分别得到变量a、b和c的内存地址。
注意:由于常量和表达式没有用户可操作的内存地址,因此&不能作用到常量或表达式上
指针和指针变量
根据内存单元地址就可以找到所需的内存单元,通常把这个地址称为指针。
在C语言中,专门存放变量(或其它程序实体)地址的变量叫指针变量。指针变量也需要存储单元(存放地址值),它本身也有地址。
让变量p存放变量a的地址,这样,由变量p的值就可找到变量a,因此称变量p指向变量a,变量p就是指针变量,它存放的地址就称为“指针”。因此,指针就是地址。
一般变量的访问形式:
有了指针变量以后,对一般变量的既可以通过变量名进行访问,也可以通过指针变量进行访问:
通过变量名或其地址(如a或&a)访问变量的方式叫直接访问方式;
通过指针变量(如p)访问它指向的变量(如a)的方式叫间接访问方式。
指针变量的定义
类型名 *标识符(指针变量名);
"类型名":表示该指针变量所指向变量的类型。
"标识符":即指针变量名,标识符前加“*”号表示该变量是指针变量,用于存放地址。
void关键字可用于定义一个通用指针变量,它可以指向任一数据类型的数据对象。对于这种指向void的指针变量,称为无类型的指针变量。
例子: void 类型 指针:
int *p1; void *p2; p1=(int *)p2; //将 p2转为 int 类型指针 p2=(void *)p1; //也可以进行如下转换,将p1变成void * 类型
指针变量的赋值和引用
“&”运算符
通过取地址运算符“&”赋值
地址运算符“&”是单目运算符,运算对象放在 &的右边,用于求出运算对象的地址。通过地址运算“&”可把一个变量的地址赋给指针变量。
int k=10,*p,*q; q=&k;
这时,scanf(“%d”,&k); 与scanf(“%d”,q); 作用相同。
指针变量的初始化
与一般变量的初值一样,在定义了一个(动态的)指针变量之后,其初值也是一个不确定的值。可以在定义变量时给指针变量赋初值,
如:float f, *p=&f; 等同于: float f, *p; p=&f; 两条语句。
则把变量f的地址赋值给了指针变量p。
通过其它指针变量赋值
可以通过赋值运算符(=),把一个指针变量的地址值赋给另一个指针变量,这样两个指针变量均指向同一地址。
用NULL给指针变量赋空值
除了给指针变量赋地址值外,还可以给指针变量赋空值,如 p=NULL;
如:p=NULL;
这样做的目的是:让指针变量存有确定的地址值,但又不指向任何变量(类似于给数值型变量赋初值0)
例子:指针是用于储存变量的地址。*是间接运算符。
#include <stdio.h> int main(int argc, char const *argv[]) { int waitag; //错误示例: // int *pint; // printf("请输入:"); // scanf("%d", pint); //此时 pint 没有地址,不能定义完就直接使用 // printf("输的是:%d", *pint); // 正确使用模式: int i,*pint=&i; printf("请输入:"); scanf("%d", pint); //此时pint 是 变量i的地址 printf("输的是:%d,%d", *pint,i); //*是间接运算符 scanf("%d", &waitag); return 0; }
输出:
请输入:5 输的是:5,5
*指向(间接)运算符
*指向运算符为单目运算符,与其他的单目运算符具有相同的优先级和结合性(即具有右结合性)。
根据*指向运算符的作用,*指向运算符和取地址运算符 & 互逆:
*(&a)==a &(*p)==p
注意:
在定义指针变量时,“*”表示其后的变量是指针变量;
在执行部分的表达式中,“*”是指向运算符,表示取指针指向地址的内容。
指针作为函数参数
函数的参数可以是简单数据类型,也可以是指针类型。
使用指针类型做函数的参数,实际上向函数传递的是变量的地址。
由于函数中获得了所传递变量的地址,因此当函数调用结束后,该地址空间的数据被物理地保留了下来
共 0 条评论