首页 > 其他分享 >C语言-指针

C语言-指针

时间:2022-10-11 21:12:02浏览次数:39  
标签:变量 int px py C语言 地址 指针

一、指针的概念

要知道指针的概念,要先了解变量在内存中如何存储的。在存储时,内存被分为一块一块的。每一块都有一个特有的编号。而这个编号可以暂时理解为指针,就像酒店的门牌号一样。

1.1、变量和地址

先写一段简单的代码:

void main(){
int x = 10, int y = 20;
}

这段代码非常简单,就是两个变量的声明,分别赋值了 10、20。我们把内存当做一个酒店,而每个房间就是一块内存。那么“int x = 10;”和“int y = 20;”的实际含义如下:

1.去酒店订了两个房间,门牌号暂时用 px、py 表示
2.让 10 住进 px,让 20 住进 py
3.其中门牌号就是 px、py 就是变量的地址
4.x 和 y 在这里可以理解为具体的房间,房间 x 的门牌号(地址)是 px,房间 y 的门牌号(地址)是 py。而 10 和 20,通过 px、py 两个门牌,找到房间,住进 x、y。

1.2、指针变量和指针的类型

指针变量就是一个变量,它存储的内容是一个指针。如果用前面的例子,可以理解为指针变量就是一张房卡,房卡存储了房间号的信息。

在我们定义一个变量的时候,要确定它的类型。int x、char ch、float、、、在定义指针变量时也是一样的,必须确定指针类型。int 变量的指针需要用 int 类型的指针存储,float 变量的指针需要用 float 类型的指针存储。就像你只能用酒店 A 的房卡存储酒店 A 中房间号的信息一样。

二、变量的指针与指针变量

变量的指针就是变量的存储地址,指针变量就是存储指针的变量。

2.1、指针变量的定义及使用

(1)指针变量的定义

指针变量的定义形式如:数据类型 *指针名;例如:

//分别定义了 int、float、char 类型的指针变量
int *x;
float *f;
char *ch;
1
2
3
4
如上面的定义,指针变量名为 x、f、ch。并不是*x、*f、*ch

(2)指针变量的使用

取地址运算符&:单目运算符&是用来取操作对象的地址。例:&i 为取变量 i 的地址。对于常量表达式、寄存器变量不能取地址(因为它们存储在存储器中,没有地址)。
指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。

代码示例:

//声明了一个普通变量 a
int a;
//声明一个指针变量,指向变量 a 的地址
int *pa;
//通过取地址符&,获取 a 的地址,赋值给指针变量
pa = &a;
//通过间接寻址符,获取指针指向的内容
printf("%d", *pa);

//声明了一个普通变量 a
int a;
//声明一个指针变量,指向变量 a 的地址
int *pa;
//通过取地址符&,获取 a 的地址,赋值给指针变量
pa = &a;
//通过间接寻址符,获取指针指向的内容
printf("%d", *pa);


(3)“&”和“*”的结合方向

“&”和“*”都是右结合的。假设有变量 x = 10,则*&x 的含义是,先获取变量 x 的地址,再获取地址中的内容。因为“&”和“*”互为逆运算,所以 x = *&x。

接下来做个小练习,输入 x、y 两个整数,然后将其中的值大的赋值给 x,小的赋值给 y。即:假设输入 x = 8,y = 9。就将 9 赋值给 x,8 赋值给 y。

void main(){
//声明两个普通变量
int x, y;
//声明两个指针变量
int *px, *py;
//声明一个临时变量,用于交换
int t;
//输入两个值,赋值给 x、y
scanf("%d", &x);
scanf("%d", &y);
//给指针变量 px、py 赋初值(关联变量 x、y)
px = &x;
py = &y;
//利用指针来对比 x、y 的值,如果 x 的值比 y 的值小,就交换
if(*px < *py){
//交换步骤,其中*px == x、*py == y
t = *px;
*px = *py;
*py = t;
}
printf("x = %d, y = %d", *px, *py);
}

void main(){
//声明两个普通变量
int x, y;
//声明两个指针变量
int *px, *py;
//声明一个临时变量,用于交换
int t;
//输入两个值,赋值给 x、y
scanf("%d", &x);
scanf("%d", &y);
//给指针变量 px、py 赋初值(关联变量 x、y)
px = &x;
py = &y;
//利用指针来对比 x、y 的值,如果 x 的值比 y 的值小,就交换
if(*px < *py){
//交换步骤,其中*px == x、*py == y
t = *px;
*px = *py;
*py = t;
}
printf("x = %d, y = %d", *px, *py);
}


输入:23 45
输出结果为:x = 45, y = 23

 


2.2、指针变量的初始化

指针变量与其它变量一样,在定义时可以赋值,即初始化。也可以赋值“NULL”或“0”,如果赋值“0”,此时的“0”含义并不是数字“0”,而是 NULL 的字符码值。

//利用取地址获取 x 的地址,在指针变量 px 定义时,赋值给 px
int x;
int *px = &x;
//定义指针变量,分别赋值“NULL”和“0”
int *p1= NULL, *p2 = 0;
1
2
3
4
5
2.3、指针运算

(1)赋值运算

指针变量可以互相赋值,也可以赋值某个变量的地址,或者赋值一个具体的地址

int *px, *py, *pz, x = 10;
//赋予某个变量的地址
px = &x;
//相互赋值
py = px;
//赋值具体的地址
pz = 4000;
1
2
3
4
5
6
7
(2)指针与整数的加减运算

指针变量的自增自减运算。指针加 1 或减 1 运算,表示指针向前或向后移动一个单元(不同类型的指针,单元长度不同)。这个在数组中非常常用。
指针变量加上或减去一个整形数。和第一条类似,具体加几就是向前移动几个单元,减几就是向后移动几个单元。
//定义三个变量,假设它们地址为连续的,分别为 4000、4004、4008
int x, y, z;

//定义一个指针,指向 x
int *px = &x;

//利用指针变量 px 加减整数,分别输出 x、y、z
printf("x = %d", *px); //因为 px 指向 x,所以*px = x

//px + 1,表示,向前移动一个单元(从 4000 到 4004)
//这里要先(px + 1),再*(px + 1)获取内容,因为单目运算符“*”优先级高于双目运算符“+”
printf("y = %d", *(px + 1));
printf("z = %d", *(px + 2));
1
2
3
4
5
6
7
8
9
10
11
12
13
(3)关系运算

假设有指针变量 px、py。

px > py 表示 px 指向的存储地址是否大于 py 指向的地址
px == py 表示 px 和 py 是否指向同一个存储单元
px == 0 和 px != 0 表示 px 是否为空指针
//定义一个数组,数组中相邻元素地址间隔一个单元
int num[2] = {1, 3};

//将数组中第一个元素地址和第二个元素的地址赋值给 px、py
int *px = &num[0], *py = &num[1];
int *pz = &num[0];
int *pn;

//则 py > px
if(py > px){
printf("py 指向的存储地址大于 px 所指向的存储地址");
}

//pz 和 px 都指向 num[0]
if(pz == px){
printf("px 和 pz 指向同一个地址");
}

//pn 没有初始化
if(pn == NULL || pn == 0){
printf("pn 是一个空指针");
}

 

标签:变量,int,px,py,C语言,地址,指针
From: https://www.cnblogs.com/030622zfy-/p/16782577.html

相关文章

  • C语言-函数
    1:函数的概念函数是一个命名了的代码块,我们通过调用函数执行相应的代码,函数可以有0个或者多个参数,而且会产生一个结果对于我的总结:我觉得函数可以说是一个能够实现一定功......
  • 算法每日一题(反转单链表)C语言版
     在本篇文章里,我将分享一道很经典的算法题———反转链表,并且分享多种方法去解决方法,希望可以帮助到你......
  • 【C语言有这个就够了】四.操作符详解(2)
    (七)关系操作符​​< <= > >= != ==​​都挺简单,唯一注意=和==(八)逻辑操作符逻辑与 &&逻辑或 ||#include<stdio.h>intmain(){inta=9;intb=1;intc......
  • C语言编译过程
    前言很多人做了很久的C/C++,也使用了很多的IDE,但很多人却不明白他们所写的.C文件在计算机底层怎么生成机器能够识别的二进制文件,这种变化经历了什么过程,这边文章将会对C语......
  • qt 容器 函数指针
    private:typedefvoid(MainWindow::*pfunc)();QHash<QString,pfunc>func_map_enter;voidMainWindow::init_qmap(void){func_map_enter.insert("page_n......
  • 初始C语言和程序设计
    这是我写的第一篇文章关于讲解C语言程序设计的,希望通过此,让大家都能初步了解C语言,也希望自己通过写这篇文章对C语言有重新的的认识,如果有不好不对的地方,麻烦大家提出,谢谢。......
  • void指针的使用
    void指针是一种不明确类型的指针,任何指针都可转换为void指针。void指针只保存了指针的值并没有记录指针指向对象的类型。因此在用到对void指针解引时,需要先把void指针转......
  • 总结了一些指针易出错的常见问题(一)
    计算机是如何从内存单元中存取数据的呢?从程序设计的角度看,有两种办法:一是通过变量名;二是通过地址。程序中声明的变量是要占据一定的内存空间的,例如,C语言中整型变量占2字节,实......
  • C语言之函数
    结构化程序设计主张按功能来分析需求,主要原则自顶向下,逐步求精,模块化等。主张按功能把软件系统逐步细分,每个功能都负责对数据进行一次处理,每个功能接收一些数据,处理完后......
  • C语言每日一题——第十四天
    第十四天这一次小明想要尝试一下语言分析……当然是最简单的文本匹配。首先“玩家”会输入长度为10的一串文字,内容全部由大小写字母、数字、空格组成,小明计划用程序匹配......