如何系统学习C 语言(中)之 指针篇
谈到指针,我们可能会想到钟表上的指针,但这里的指针不是现实生活中看得见摸得着的钟表上的指针,c 语言中的指针只存在于逻辑思维中,物理上并不存在。
同时,指针也是C 语言中最精华的部分,通过灵活地运用指针,可以写出独具匠心、构思巧妙的程序。
指针基础
c 语言中指针的实质就是地址
内存地址
对于计算机中的内存,都会以字节为单位,逐一地编上号码,这个编号就是内存的地址,如下图:
图中,按字节给内存依次编上了号码,其中每个数字对应着1字节的内存空间,而数字就是内存的地址。
取地址运算符"&"
C 语言中,可以用"&"符号来获取一个变量的内存地址。只要在变量名前加上"&"符号就可以获取变量名所表示的内存地址。当获取到变量的内存地址后,就相当于得到了一个指向该变量的指针。简单的总结一下:
&变量名 == 该变量的内存地址 == 指向该变量的指针
解引用运算符“*”
既然可以通过取地址符获取一个指向变量的指针。那怎么通过这个指针再找回原来的变量呢?
这时候就有了一个和取地址相逆的操作,我们把它称为解引用,解引用需要用到星号“ * ” ,它的使用格式为:
*指针
另外,C 语言中,还允许定义专门用于存储内存地址类型的变量,我们将其称为地址变量,又被称为指针变量。
指针、指针变量与内存地址小区分
首先内存地址是内存单元的一个编号,可以把它当成一个常量看待;指针变量是一个能够存放内存地址的容器,它是一个变量;指针是无形的,我们可以把它想象成一个带箭头的长线,线尾连着指针变量,而箭头指向了指针变量所保存的内存地址处的数据。
指针进阶浅谈
由于指针学起来涉及的内容比较多,难度相比其他的也较大,所以下面我只是简单的谈一谈指针变量、指针与数组,指针与字符串、指针与函数、二级指针,权且当做给大家提个醒,理一理逻辑,要具体学习还得自己再编程实战中去体悟。
1,指针变量
指针变量也是变量的一种,但它与普通变量有所不同,普通变量存储的是数据,指针变量存储的是内存地址。
//指针变量的定义格式
数据类型 *变量名;
定义指针变量后,不要直接去使用,因为使用赋予确定内存地址的"野指针"可能会出大问题。
2,指针与数组
C 语言中,数组名所对应的值就是第一个数组元素的内存地址,即可以把数组名看为指向数组首元素的指针。通过下面代码片段理解:
int a[3]={10,20,30};
printf("The first element value: %d\n",*a); //输出为:The first element value: 10
还有什么很多诸如数组指针,指针数组等等各种定义,我觉得单纯的记他们没有什么必要,本身用的就不多,就算到了用的时候,直接问问”度娘“就ok 了
3,指针与字符串
字符串是常量,常量是C 语言中最简单的表达式,而所有的表达式都是有值的,那字符串常量的值是什么呢?字符串常量的值就是字符串中首字符的内存地址。例如 apple 这个字符串常量的值就是第一个字符 a 的内存地址。因此我们可以用一个char 类型的指针来指向这个字符串。
char *ptr = "apple";
4,指针与函数
函数时拥有特定功能的语句的集合,是构成程序的基本模块。在函数的定义过程中,可以将指针作为函数的参数,也可以将指针作为函数的返回值,甚至可以用指针来指向一个函数。
限于篇幅限制,这里就简单的提示一下,具体的区别或找一些具体例子来体会,大家很容易在网上搜集到的~ ~。
5,二级指针
所谓的二级指针就是指向指针的指针。其定义格式如下:
数据类型 **变量名
指针的实质就是内存地址,由于指针变量是可以存储内存地址的变量,因此也可将其视作指针。而指针变量本身也是变量,需要占用内存空间,因此也有内存地址。如果将这个内存地址在存储到另一个指针变量中,就形成了一个指向指针的指针,即指向指针的指针就是二级指针。
定义好二级指针后就需要对它进行初始化与赋值了
int a = 10; //定义一个int 类型的变量a,并初始化为10
int *pi = &a; //定义一个int 类型的指针变量pi,并初始化其值为a 的内存地址
有了指针变量pi ,下面就可以定义一个二级指针并对其进行初始化了,如下:
int **ppi = π //定义二级指针ppi,并通过取地址符获取指针变量pi 的内存地址,将其初始化给二级指针ppi
6,特殊指针
指针是C 语言的精髓和灵魂。其中有两种相对特殊的指针,一个是空指针,另一个是void 类型的指针。
int *pi=NULL; //空指针
void *pv; //void类型的指针,任何类型的指针都可以被隐式地转换为void类型的指针。因此,它通常作为函数的参数出现。
如何系统学习C 语言(中)之 指针篇的更多相关文章
- GO语言中的指针
http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...
- C语言中的指针(二)
指针指向谁,就把谁的地址赋给指针,指针变量和指针指向的内存变量是不一样的.不停的给指针赋值,相当于是不断的改变指针的指向. 在开发中要避免野指针的存在,在指针使用完毕之后,记得要给指针赋值成为NULL ...
- C语言中的指针数组
C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...
- 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...
- C语言中的指针笔记
C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...
- C语言中的指针加减偏移量
C语言指针偏移技巧(也是一个要注意的坑) - 陈杰柱的博客 - CSDN博客 https://blog.csdn.net/cjzjolly/article/details/82116772 C语言中 ...
- C语言中的指针学习(小黑板)
指针是C语言中的精华所在,也是C语言的危险之在,今天又重现温习了一下C语言,做了一下总结. 欢迎批阅. (1)指针的含义指针的本质也是数据类型,它是指向地址的变量.例如: { int a = 10; ...
- 如何系统学习C 语言(中)之 结构体篇
1,结构体 在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现--它们都只适合单一属性的数据.那现实生活中,很多对象都是具有多属性的.例 ...
- 解读 C 语言中的指针
我想对很多学习C语言的新手来说,指针无疑是一个难点.但是,我觉得指针也是C语言特别重要的一个特性.也许,你在除了C和C++以外的编程语言中,很少看到指针.而C++中,也多用引用,而非指针.指针,作为一 ...
随机推荐
- SpringCloud 学习总结
SpringCloud 学习总结 学习回顾 1.Maven依赖管理 在微服务项目中,我们一般是先创建一个父项目模块对整个项目的依赖进行版本限定和依赖控制,子模块继承父模块后,不需要再考虑版本和依赖 ...
- 【redis前传】集思广益之quicklist,取其精华去其糟粕
前言 在之前我们已经学习了redis五大数据结构中的list结构.其内部是linkedList和zipList两种结构.这是我们已经学习的内容.之前我没有结合操作具体查看.事实上在两者中还存在一种结合 ...
- DEM数据全国各省的裁剪与分享(30m、90m、250m、1000m)
1.简介: 数字高程模型(Digital Elevation Model),简称DEM,是通过有限的地形高程数据实现对地面地形的数字化模拟. 这次分享的数据是全国34个省份的DEM裁剪数据,一共有6期 ...
- 学习PHP中国际化地数字格式处理
不知道大家有没有了解过,对于数字格式来说,西方国家会以三位为一个进位,使用逗号来分隔.比如,12345678,用标准的格式来表示的话就是 12,345,678 .不过我们中文其实并不会有这样的分隔符, ...
- final关键字在PHP中的使用
final关键字的使用非常简单,在PHP中的最主要作用是定义不可重写的方法.什么叫不可重写的方法呢?就是子类继承后也不能重新再定义这个同名的方法. class A { final function t ...
- Docker系列(14)- Portainer可视化面板安装
官网 https://documentation.portainer.io/v2.0-be/deploy/beinstalldocker/ 可视化 portainer docker run -d -p ...
- Faster RCNN 改进论文及资料
1,面向小目标的多尺度Faster RCNN检测算法 黄继鹏等 对高分辨率图像进行下采样和上采样,使得网上获取的数据与实际测试数据分布接近. 下采样:最大池化和平均池化 上采样:线性插值,区域插值,最 ...
- python爬虫与mysql,mongobd(1)(2)第一个视频python_pymysql 安装与使用类型,import解决 问题之模块引ru 就是解决你的问题
import pymysql.cursors ''' 1.创建连接 2.创建游标 3.执行sql 5.接受结果 ''' # 1.连接 connection =pymysql.Connect( # 域名 ...
- Loj#3026-「ROIR 2018 Day1」管道监控【Trie,费用流】
正题 题目链接:https://loj.ac/p/3026 题目大意 给出\(n\)个点的一棵外向树,然后\(m\)个字符串和费用表示你每次可以花费这个费用覆盖路径字符串和给出字符串相等的路径,求覆盖 ...
- 自学 Python,视频教程和代码一看就懂,动手就废,应该这么学
一.代码量太少了,看得多做得少,导致一做就错. 每一个测试工程师必定是在大量的时间和代码中提升的自己,如果你只是看视频的话,那永远都停留在理论上,很多问题是要实践才能发现的 我打个比方你看视频的时 ...