• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

C学习-基础:指针的基本概念、定义与引用

指针和指针变量的基本概念

内存及其地址

在程序运行之前就将程序和数据存入计算机内存。存储器中的一个字节称为一个内存单元,为了正确地访问这些内存单元,必须为每个内存单元编号。根据内存单元的编号即可准确地找到该内存单元。内存单元的编号叫做地址

变量

image.png

变量的存储单元程序分配,因此变量的地址不能人为确定,而要通过取地址运算符&获取

例如:&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
0
下一篇:C学习-基础:指针与一维数组、二维数组

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。