指针的概念

指针代表一个变量的内存地址,通过&可以拿到变量的内存地址。变量不等于指针,通过*可以拿到指针所指向的变量的值。

在 C 中,存在指针变量,指针变量的声明格式:int* varName = &varAddress。声明指针变量之后,通过*可以拿到该指针变量所指向的值。例如,feet 变量是一个int类型,指针变量的类型也是int

int main(void)
{
int feet = 10; // int 类型的变量
int* pfeet = &feet; // 指针变量,与 feet 数据类型一样 printf("before updating feet is %d\n", feet); // before updating feet is 10
*pfeet += 10; // 通过 * 拿到指针变量所指向的值
printf("now feet is %d\n", feet); // now feet is 20
return 0;
}

指针的作用

因为函数作用域的影响,局部变量只能存在于一个函数作用域内使用,一个函数传递它的局部变量给另一个函数,这个变量的地址会变化,也就是变量不是同一个。如果想“穿透”作用域带来的这种限制,考虑使用指针。

void change(int, int); // 声明一个函数

int main(void)
{
int x = 10, y = 5; // 声明 main 函数的局部变量
change(x, y); // 传递局部变量,main 函数的 x、y 和 change 的 x、y 地址不相同
printf("[3] x = %d, y = %d\n", x, y);
return 0;
} void change(int x, int y)
{
printf("[1] x = %d, y = %d\n", x, y);
x = 20;
y = 10;
printf("[2] x = %d, y = %d\n", x, y);
}

在 main 函数中声明的两个局部变量,change 函数的变量由 main 传递,但实际上 x 和 y 的地址都不一样。main 函数修改 x 或 y,不会影响 change 函数内的 x 或 y。而传递指针,就能够穿透“作用域”,改变上述问题。

指针指向的是内存地址,只要拿到内存地址,找到门牌号,就能修改变量的值。下面通过指针来修改 main 函数的 x 和 y:

void change(int*, int*); // 声明指针变量,传递变量的内存地址

int main(void)
{
int x = 10, y = 5;
change(&x, &y); // 传递内存地址,而不是变量
printf("[3] x = %d, y = %d. x Address = %p, y Address = %p\n", x, y, &x, &y);
return 0;
} void change(int* x, int* y)
{
printf("[1] x = %d, y = %d. x Address = %p, y Address = %p\n", *x, *y, x, y);
*x = 20;
*y = 10;
printf("[2] x = %d, y = %d. x Address = %p, y Address = %p\n", *x, *y, x, y);
}

change 函数接收的是一个指针,函数找到内存地址所对应的变量(通过*拿到内存所指向的变量值),修改其指针所指向的变量值,main 函数的 x 和 y 也随着改变:

探索 C 语言的指针的更多相关文章

  1. 浅谈c语言的指针

    对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...

  2. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  3. C语言二重指针与malloc

    (内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include &l ...

  4. C语言函数指针基础

    本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...

  5. 为什么C/C++语言使用指针

    这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的 ...

  6. C语言的指针变量

    C语言的指针变量 在C语言中,变量是固定范围的存储空间,它存储的是赋给他的值, 比如: ; /* 这里是定义一个整型变量a,并把12这个值存储在a的地址空间上 这个地址空间是系统随机分配的,对用户是透 ...

  7. Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

    Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...

  8. “对外部(局部)变量的访问”是C语言函数指针的最大弱点

    1.“对外部(局部)变量的访问”是C语言函数指针的最大弱点 . #include <stdio.h> #include <stdlib.h> /* 结构体定义 */ struc ...

  9. go语言学习--指针的理解

    Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, fu ...

  10. C语言中指针占据内存空间问题

    以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...

随机推荐

  1. 【每日一题】【递归实现、自下而上、优化】-2022年1月12日-NC68 跳台阶

    描述一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果). 数据范围:0 \leq n \leq 400≤n≤40要求:时间复杂度: ...

  2. vue3 el-pagination 将 英文 修改 为 中文

    当前视图: 我要做的是将 Total 类似的 英文 改为 中文 1.  在组件里引入  ElConfigProvider 组件 和中文包 // ElConfigProvider 组件 import { ...

  3. 大数据HDFS凭啥能存下百亿数据?

    欢迎关注大数据系列课程 前言 大家平时经常用的百度网盘存放电影.照片.文档等,那有想过百度网盘是如何存下那么多文件的呢?难到是用一台计算机器存的吗?那得多大磁盘啊?显然不是的,那本文就带大家揭秘. 分 ...

  4. 前端HTML不使用flash兼容IE浏览器播放视频

    前言:最近公司项目上有个需求就是在IE8上不使用flash技术来去实现视频播放 分析:IE8不支持HTML5,所以不能使用video标签,在非IE的浏览器可以使用video标签 目录 我的解决 DEM ...

  5. TCPView工具

    TCPView:一个查看端口和线程的小工具.(不需安装) 主界面: 启动程序之后,你就发现TCPView将你目前在使用的所有进程都列举出来了,并时不时的会用红.黄.绿三种颜色标注某些进程: 红色代表该 ...

  6. 【机器学习】李宏毅——Anomaly Detection(异常检测)

    异常检测概述 首先要明确一下什么是异常检测任务.对于异常检测任务来说,我们希望能够通过现有的样本来训练一个架构,它能够根据输入与现有样本之间是否足够相似,来告诉我们这个输入是否是异常的,例如下图: 那 ...

  7. 英华学堂网课助手Linux版本

    首先我们下去GitHub把文件下载下来记得 脚本地址: https://github.com/aoaostar/mooc/releases/latest 这几个版本随便下哪个都可以,下载完之后我们通过 ...

  8. 使用APICloud AVM多端组件快速实现app中的搜索功能

    很多 APP 中都有搜索功能的需求,本文介绍怎么使用 avm 多端组件快速实现搜索功能. 在 APICloud 模块库搜索 animate-UISearchBar,添加到项目.多端组件需要下载源码,引 ...

  9. [seaborn] seaborn学习笔记0-seaborn学习笔记章节

    seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库.seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形.相对于matp ...

  10. JavaScript 中URL 查询字符串(query string)的序列与反序列化

    方法一: 在 JavaScript 中,可以使用 URLSearchParams 对象来处理 URL 中的查询字符串. 序列化(将 JavaScript 对象转换为查询字符串)可以使用 URLSear ...