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

在 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 语言的指针的更多相关文章
- 浅谈c语言的指针
对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...
- C#委托与C语言函数指针及函数指针数组
C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...
- C语言二重指针与malloc
(内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include &l ...
- C语言函数指针基础
本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...
- 为什么C/C++语言使用指针
这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的 ...
- C语言的指针变量
C语言的指针变量 在C语言中,变量是固定范围的存储空间,它存储的是赋给他的值, 比如: ; /* 这里是定义一个整型变量a,并把12这个值存储在a的地址空间上 这个地址空间是系统随机分配的,对用户是透 ...
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
- “对外部(局部)变量的访问”是C语言函数指针的最大弱点
1.“对外部(局部)变量的访问”是C语言函数指针的最大弱点 . #include <stdio.h> #include <stdlib.h> /* 结构体定义 */ struc ...
- go语言学习--指针的理解
Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, fu ...
- C语言中指针占据内存空间问题
以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...
随机推荐
- 【大数据面试】【框架】Hadoop-入门、HDFS
一.入门 1.常用端口号 2.x 50070:查看HDFS Web-UI 8088:查看MapReduce运行情况 19888:历史服务器 9000:hdfs客户端访问集群 50090:Seconda ...
- 【RocketMQ】主从同步实现原理
主从同步的实现逻辑主要在HAService中,在DefaultMessageStore的构造函数中,对HAService进行了实例化,并在start方法中,启动了HAService: public c ...
- PostgreSQL和MySQL的优劣对比
在开发项目的过程中,难免要面对选择数据库的情况.总结此文章是因为在之前公司里使用的都是MYSQL 数据库,而在现在公司里,新项目中使用的是 PostgreSQL 数据库,在使用过程中,经常需要查找两种 ...
- v-if v-for同时使用 解决eslint报错问题
<template v-for="sec in item.goods"> <div v-if="item.showDetail" class= ...
- python多线程批量操作交换机
import time import socket import threading def device_info(): ip_list = [] name_list = [] user_list ...
- linux安装Erlang和Rabbitmq以及安装问题解决
安装环境: Alibaba Cloud Linux 安装erlang命令: rpm --import https://packages.erlang-solutions.com/rpm/erlang_ ...
- Go DevOps大厂运维平台开发进阶实战营
使用 Jenkinsfile 创建流水线已报名老男孩运维课,见底下评论.enkinsfile 是一个文本文件,它包含 Jenkins 流水线的定义,并被检入源代码控制仓库.Jenkinsfile 将整 ...
- js获取当前年月日时分
function GetDate(){ var now = new Date(); var year = now.getFullYear(); //年 var month = now.getMonth ...
- Raft一致性共识算法论文学习
论文地址:https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf 看完raft共识算法,脑袋非常懵,所以写一篇学习笔记,记录一下. raft ...
- IDEA 2022.1.3 配置 Tomcat 模板
本地运行 Tomcat 首先,下载得到 Tomcat 压缩包 选择合适的位置解压,路径不要有中文和空格 结构如下所示 目录结构说明: bin 可执行文件目录 conf 配置文件目录 lib 存放lib ...