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);  // 22
   
   pc = &c;
   printf("指针pc地址: %p\n", pc);
   printf("指针pc内容: %d\n\n", *pc); // 22
   
   c = 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); // 2
   return 0;
}

输出结果

c的地址: 003FFBF8
c的值: 22

指针pc地址: 003FFBF8
指针pc内容: 22

指针pc地址: 003FFBF8
指针pc内容: 11

c的地址: 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);  // 5
   return 0; 
}

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

这是因为

int *p = &c;

相当于

int *p:
p = &c;

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

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

int* p = &c;

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NodeJS】Nodejs安装及环境配置

下载安装包 网址&#xff1a;https://nodejs.org/en 安装程序 1.下载完成后&#xff0c;双击安装包&#xff0c;进行安装&#xff0c;一路默认配置 nxet 即可&#xff0c;安装路劲给默认在C盘&#xff0c;或者选择其他位置&#xff0c;当前教程默认C盘 2.下图根据本身的…

Mybatis报错找不到参数解决之编译保留参数名称

Hi, I’m Shendi Mybatis报错找不到参数解决之编译保留参数名称 需求场景 在使用 Mybatis 的过程中&#xff0c;对于函数参数&#xff0c;通常会加上 Param 注解来给参数命名&#xff0c;以让 Mybatis 找到参数。 有的时候忘记添加&#xff0c;执行时就会报找不到参数的错误&…

Python接口测试框架选择之pytest+yaml+Allure!

一、为什么选择pytest&#xff1f; pytest完全兼容python自带的unittest pytest让单元测试更简单&#xff0c;能很好的管理测试用例。 对于实现接口测试的复杂场景&#xff0c;pytest的fixture、PDB等高阶用法都能实现需求。 入门简单&#xff0c;对于代码基础薄弱的团队人…

Live800:客服中心必备的7种客户服务原则

在现代商业社会中&#xff0c;客户服务已经成为企业竞争的重要因素之一。提供高质量的客户服务可以帮助企业赢得客户的忠诚度和信任&#xff0c;从而推动企业的发展。客服中心是企业与客户之间的桥梁&#xff0c;对于客户服务的质量要求更高。为了提高客服中心的服务质量&#…

Pandas教程(非常详细)(第六部分)

接着Pandas教程&#xff08;非常详细&#xff09;&#xff08;第五部分&#xff09;&#xff0c;继续讲述。 三十一、Pandas Excel读写操作详解 Excel 是由微软公司开发的办公软件之一&#xff0c;它在日常工作中得到了广泛的应用。在数据量较少的情况下&#xff0c;Excel 对…

移动端APP版本治理

1 背景 在许多公司&#xff0c;APP版本都是不受重视的&#xff0c;产品忙着借鉴&#xff0c;开发埋头编码&#xff0c;测试想着不粘锅。 只有在用户反馈app不能用的时候&#xff0c;你回复客服说&#xff0c;让用户升级最新版本&#xff0c;是不是很真实。 而且业界也很少有…

SpringEvent事件通知机制

“Spring Event” 是 Spring 框架通过事件驱动的编程模型来处理应用程序中的事件。开发者可以定义自己的事件&#xff0c;然后在应用程序中触发这些事件。Spring 框架提供了用于发布和监听事件的机制&#xff0c;以实现松散耦合的组件间通信。 有两个核心组件&#xff1a; 事…

基于springboot实现校园医疗保险管理系统【项目源码】计算机毕业设计

基于springboot实现校园医疗保险管理系统演示 系统开发平台 在线校园医疗保险系统中&#xff0c;Eclipse能给用户提供更多的方便&#xff0c;其特点一是方便学习&#xff0c;方便快捷&#xff1b;二是有非常大的信息储存量&#xff0c;主要功能是用在对数据库中查询和编程。其…

SLF4J: Class path contains multiple SLF4J bindings.

问题截图 问题原因 这里就是由于hbase 安装路径下的一个文件和hadoop安装路径下的文件起冲突了 解决办法 我的路径&#xff1a; 这个一定要看自己电脑上的路径 /usr/local/hbase/lib/client-facing-thirdparty/ slf4j-log4j12-1.7.25.jar更名为&#xff1a; /usr/local/hb…

docker部署Prometheus+Cadvisor+Grafana实现服务器监控

一&#xff1a;Prometheus 1&#xff1a;介绍&#xff1a; Prometheus是一个在SoundCloud上构建的开源系统监视和警报工具包 2&#xff1a;特点 多维度数据模型-由指标键值对标识的时间序列数据组成&#xff1b;PromQL&#xff0c;一种灵活的查询语言&#xff1b;不依赖分布…

会议邀请 | 思腾合力邀您共赴第二十五届高交会(CHTF2023)

2023年11月15-19日&#xff0c;以“激发创新活力 提升发展质量”为主题的「第二十五届中国国际高新技术成果交易会&#xff08;CHTF2023&#xff09;」将在深圳会展中心&#xff08;福田&#xff09;和深圳国际会展中心&#xff08;宝安&#xff09;举办。思腾合力作为行业领先…

NOIR脑机接口机器人——让脑机接口通过少样本学习实现做家务的能力

一、概述 大脑与机器人接口&#xff08;BRI&#xff09;是人类艺术、科学和工程的集大成之作&#xff0c;其影响已经贯穿于无数科幻作品和创意艺术之中&#xff0c;如《黑客帝国》和《西部世界》等。然而&#xff0c;要真正实现BRI并创造出能够与人类完美协同运作的机器人系统…

前端开发好用的vscode插件

1.TONGYI Lingma 通义灵码&#xff0c;是一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云 SDK/API 的使用场景调优&#xff0…

音频限幅器电路芯片D2761,工作电压范围宽,输出噪声低

D2761是为保护扬声器所设计的音频限幅器&#xff0c;其限幅值可通过外接电 阻来调节&#xff0c;适合在个人电脑、便携式音响等系统中作音频限幅用。 主要特点&#xff1a; ● 工作电压范围宽&#xff1a;2.7V ~ 13.0V ● 外接电阻调节限幅范围&#xff1a;0.2V …

UE4动作游戏实例RPG Action解析四:装备系统

导语: 以加血道具为例,详细分析拆解ActionRPG的装备系统,包含装备系统需求和数据结构设计,以及实现 一、装备系统需求: 装备槽: 已获取装备和未获取装备: 当已经装备一个道具时,再次捡到道具,会把道具放在装备库,不会放在装备槽中, 当没有装备道具时,会拾取道具…

Android图片压缩插件

今天才发现这个还有插件&#xff0c;平时都是传网站上压缩完了又下载下来覆盖原文件。现在有这个了&#xff0c;开发好高效&#x1f601;&#xff01;分享给大家&#xff0c;可能对你们有用哈哈&#x1f606;。也可能你们早都知道了……

P6入门:项目初始化10-项目详情之设置Setting

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…

java实现计数排序

图解 计数排序是一种线性时间复杂度的排序算法&#xff0c;它不基于比较排序&#xff0c;而是根据待排序序列中元素的值来进行排序。 具体的过程如下&#xff1a; 统计序列中每个元素出现的个数&#xff0c;得到一个计数数组count。其中&#xff0c;count[i]表示待排序序列中值…

专业的SRM系统全流程管理服务

一、什么是SRM系统 SRM系统&#xff0c;即供应商关系管理&#xff0c;是供应链管理中的重要组成部分&#xff0c;帮助企业与供应商建立、维护和改善业务关系&#xff0c;以实现双方共赢。本文将从供应商寻源到合同签订、订单履行、到付款及供应商评价等环节&#xff0c;阐述SR…

【开源】基于Vue.js的超市自助付款系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、研究内容2.1 商品类型模块2.2 商品模块2.3 超市账单模块 三、界面展示3.1 登录注册模块3.2 超市商品类型模块3.3 超市商品模块3.4 商品购买模块3.5 超市账单模块 四、部分源码展示4.1 实体类定义4.2 控制器接口 五、配套文档展示…