C 语言指针

C 语言指针

在本教程中,您将学习指针。什么是指针,如何使用它们以及在示例的帮助下使用它们时可能遇到的常见错误。

指针是 C和C ++ 编程的强大功能。在学习指针之前,让我们学习一下C语言编程中的地址。

C 语言地址

如果程序中有变量var,则&var将在内存中提供其地址。

使用scanf()函数时,我们已多次使用地址。

scanf("%d", &var);

在此,用户输入的值存储在var变量的地址中。让我们举一个可行的实例。

#include <stdio.h>
int main()
{int var = 5;printf("var: %d\n", var);// 注意在var之前使用&printf("address of var: %p", &var);  return 0;
}

输出结果

var: 5 
var地址: 2686778

**注意:**运行上面的代码时,您可能会获得其他地址。

C 语言指针

指针(指针变量)是用于存储地址而非值的特殊变量。

指针语法

这是我们如何声明指针的方法。

int* p;c

在这里,我们已经声明了一个int类型的指针p。

您也可以通过以下方式声明指针。

int *p1;
int * p2;

让我们再举一个声明指针的实例。

int* p1, p2;

在这里,我们声明了一个指针p1和一个普通变量p2。

给指针分配地址

让我们举个实例。

int* pc, c;
c = 5;
pc = &c;

在此,将5分配给c变量。并且,将c的地址分配给pc指针。

获取指针所指向的值

为了获得指针所指向的内容的值,我们使用了解引用运算符(*)。例如:

int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc);   // 输出: 5

此处,c的地址已分配给pc指针。为了获取存储在该地址中的值,我们使用了*pc。

改变指针指向的值

让我们举个实例。

int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c);    // 输出: 1
printf("%d", *pc);  // 输出: 1

我们已经将c地址分配给了pc指针。

然后,我们将的值更改c为1。由于pc和的地址c相同,因此*pc得到1。

让我们再举一个实例。

int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc);  // 输出: 1
printf("%d", c);    // 输出: 1

我们已经将c地址分配给了pc指针。

然后,我们使用* pc = 1;将* pc更改为1。 由于pc和c的地址相同,因此c等于1。

让我们再举一个实例。

int* pc, c, d;
c = 5;
d = -15;pc = &c; printf("%d", *pc); // 输出: 5
pc = &d; printf("%d", *pc); // 输出: -15

最初,使用的地址c分配给pc指针pc = &c;。因为c是5,所以*pc给我们5。

然后,使用将地址d分配给pc指针pc = &d;。由于d是-15,所以*pc给我们-15。

示例:指针的工作方式

让我们举一个可行的实例。

#include <stdio.h>
int main()
{int* pc, c;c = 22;printf("c的地址: %p\n", &c);printf("c的值: %d\n\n", c);  // 22pc = &c;printf("指针pc地址: %p\n", pc);printf("指针pc内容: %d\n\n", *pc); // 22c = 11;printf("指针pc地址: %p\n", pc);printf("指针pc内容: %d\n\n", *pc); // 11*pc = 2;printf("c的地址: %p\n", &c);printf("c的值: %d\n\n", c); // 2return 0;
}

输出结果

c的地址: 003FFBF8
c的值: 22指针pc地址: 003FFBF8
指针pc内容: 22指针pc地址: 003FFBF8
指针pc内容: 11c的地址: 003FFBF8
c的值: 2

该程序的用法

  1. int* pc, c;
    将创建一个指针变量和一个普通变量。
    这里创建了一个指针pc和一个普通变量c,都是int类型。由于pc和c没有初始化在最初,指针pc指向没有地址或一个随机地址。变量c有一个地址,但包含随机的垃圾值。

  2. c = 22;
    22被分配给变量c。
    这是给变量c赋值22,也就是说,22被存储在变量c的内存中。

  3. pc = &c;
    变量c的地址分配给指针pc。
    这将变量c的地址分配给指针pc。

  4. c = 11;
    11分配给变量c。
    这将11分配给变量c。

  5. *pc = 2;
    将5分配给指针变量的地址。
    这会将指针pc指向的内存位置的值更改为2。

使用指针时的常见错误

假设您希望指针pc指向c的地址。 然后,

int c, *pc;//pc是地址,但c不是
pc = c; // Error//&c是地址,但* pc不是
*pc = &c; // Error//&c和pc都是地址
pc = &c;//c和*pc值
*pc = c;

这是指针语法初学者经常会感到困惑的示例。

#include <stdio.h>
int main() {int c = 5;int *p = &c;printf("%d", *p);  // 5return 0; 
}

使用时为什么没有出现错误int *p = &c;?

这是因为

int *p = &c;

相当于

int *p:
p = &c;

在这两种情况下,我们都创建了一个指针p(不是*p)并给它赋值&c。

为了避免这种混乱,我们可以使用如下语句:

int* p = &c;

现在您知道了什么是指针,您将在下一个教程中学习指针与数组的关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/176665.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

debian 修改镜像源为阿里云【详细步骤】

文章目录 修改步骤第 1 步:安装 vim 软件第 2 步:备份源第 3 步:修改为阿里云镜像参考👉 背景:在 Docker 中安装了 jenkins 容器。查看系统,发现是 debian 11(bullseye)。 👉 目标:修改 debian bullseye 的镜像为阿里云镜像,加速软件安装。 修改步骤 第 1 步:…

dgl 的cuda 版本 环境配置(dgl cuda 版本库无法使用问题解决)

1. 如果你同时有dgl dglcu-XX.XX 那么&#xff0c;应该只会运行dgl &#xff08;DGL的CPU版本&#xff09;&#xff0c;因此&#xff0c;你需要把dgl(CPU)版本给卸载了 但是我只卸载CPU版本还不够&#xff0c;我GPU 版本的dglcu依旧不好使&#xff0c;因此吧GPU版本的也得卸载…

【大语言模型】Docker部署清华大学ChatGLM3教程

官方地址&#xff1a;https://github.com/THUDM/ChatGLM3 1 将代码保存至本地 方法1&#xff1a; git clone https://github.com/THUDM/ChatGLM3 方法2&#xff1a; https://github.com/THUDM/ChatGLM3/archive/refs/heads/main.zip 2 创建Docker文件 注&#xff1a;请先…

嵌入式系统中,输入网址之后,发生了什么?

让我们一步一步地来看这个过程。 步骤1&#xff1a; 用户在浏览器中输入一个URL&#xff08;比如www.bytebytego.com&#xff09;&#xff0c;然后按下回车键。首先&#xff0c;我们需要将这个URL转换成一个IP地址。通常&#xff0c;这个映射关系会被存储在缓存中&#xff0c…

飞天使-django概念之urls

urls 容易搞混的概念&#xff0c;域名&#xff0c;主机名&#xff0c;路由 网站模块多主机应用 不同模块解析不同的服务器ip地址 网页模块多路径应用 urlpatterns [ path(‘admin/’, admin.site.urls), path(‘’, app01views.index), path(‘movie/’, app01views.movi…

多机器人群体的任务状态与机器人状态同步设计思路

背景技术 近年来&#xff0c;随着科学技术的发展需要&#xff0c;机器人技术不断进步。面临任务的日益复杂化&#xff0c;单机器人在很多环境下已经无法满足生产要求&#xff0c;于是国内外科研工作者对多机器人技术投入了大量关注&#xff0c;提出了利用多机器人协作来代替单机…

智慧化城市内涝的预警,万宾科技内涝积水监测仪

随着城市化进程的加速&#xff0c;伴随的是城市内涝问题日益凸显。频繁的暴雨和积水给市民的生活带来了诸多不便&#xff0c;也给城市的基础设施带来了巨大压力。如何解决这一问题&#xff0c;成为智慧城市建设的重要课题和政府管理的工作主题&#xff0c;只要内涝问题得到缓解…

linux之用户管理

一、是什么 Linux是一个多用户的系统&#xff0c;允许使用者在系统上通过规划不同类型、不同层级的用户&#xff0c;并公平地分配系统资源与工作环境 而与 Windows 系统最大的不同&#xff0c; Linux 允许不同的用户同时登录主机&#xff0c;同时使用主机的资源 既然是多用户…

Qt DragDrop拖动与放置

本文章从属于 Qt实验室-CSDN博客系列 拖放操作包括两个动作&#xff1a;拖动(drag)和放下(drop或称为放置)。 拖动允许 对于要拖出的窗口或控件&#xff0c;要setDragEnabled(true) 对于要拖入的窗口或控件&#xff0c;要setAcceptDrops(true) 下面以一个具体的用例进行说…

搜维尔科技:【软件篇】TechViz是一款专为工程设计的专业级3D可视化软件

在沉浸式房间内深入研究您自己的 3D 数据 沉浸式房间是一个交互式虚拟现实空间&#xff0c;其中每个表面&#xff08;墙壁、地板和天花板&#xff09;都充当投影屏幕&#xff0c;创造高度沉浸式的体验。这就像您的 3D 模型有一个窗口&#xff0c;您可以在其中从不同角度走动、…

java版小程序商城免费搭建-直播商城平台规划及常见的营销模式有哪些?电商源码/小程序/三级分销

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

运动型蓝牙耳机什么牌子好?市面上热门的运动耳机推荐

​随着生活节奏的加快&#xff0c;越来越多的人开始关注健康和运动。而在运动的时候&#xff0c;佩戴耳机听音乐已经成为了很多人的选择。但是&#xff0c;市面上的运动耳机种类繁多&#xff0c;如何选择一款适合自己的呢&#xff1f;下面&#xff0c;我推荐几款市面上热门的运…