C和指针

C语言中指针和数组详解 数组是一种用于存储相同类型数据的集合。数组中的每个元素都有一个固定的位置,并且可以通过索引访问。数据类型 数组名[数组大小];指针是一个变量,它存储另一个变量的地址。数据类型 *指针名;int *ptr;指针和数组是C语言中两个非常重要的概念。通过理解它们的定义、基本操作和相互关系,程序员可以编写出更加高效、灵活的代码。指针和数组的应用场景非常广泛,包括动态数组、函数参数、字符串处理等。在实际编程中,正确使用指针和数组可以显著提高程序的性能和可维护性。 阅读详情

C和指针

 

在C中有一个很重要的概念,或许大家都知道,那就是指针。在很多初学者刚接触C的时候都认为这是最难的知识点了。没错,我刚开始学的时候也是这么想的,上了第一节课后,第一感受就是:天啊,这简直就是天书!由于个人对于C的爱好,经过一段时间的学习和研究之后,发现这一块是我最喜欢的,并且逐步发现这也是本人的强项之一了(呵呵,有点夸耀自己了!).

大家谁都知道,至真是很有效的表示许多复杂的数据结构,比如队列,链表,树和图等,因此熟练掌握指针和正确使用指针对程序员来说是至关重要的。至少我到现在还没听说过有哪位c程序员不用掌握指针的。

的确,对于初学者来说,至真是很难的,至少是非常难入门的。其实,就个人感觉来说,指针还是比较简单的。只要把握了本质是不难掌握它的,甚至是运用自如(不过本人还没达到这水平)。

下面就如下几个知识点来说明简单谈谈个人对于指针的学习感受和认识。
1、内存和地址

正如大家知道的,每个变量在内存中都占有一定的存储单位,每种语言都是这样的。c编译程序在对程序编译时,根据程序中的变量类型,在内存中为其分配相应的存储空间,而变量在内存中的首地址,就是该百年量的地址,同时,在这块内存地址中的数据就是变量内容。所以如果声明没有初始值的变量时,那么它们的内容是随机的,不确定的。
打个比方,比如一条街道上,有一排的房子,那么每间房子都有它的固定的门牌号。而每间房子也拥有它的房主。所以当你要寻找一位朋友或者商业合作伙伴(这就是你要的变量),那么你可以直接按照他给你的门牌号(相当于变量的地址)接找到你的朋友,或许你手中有一个门牌号,你需要确认房主(地址中的内容),那么你可以到这间房子,然后敲门问:“请问是张生家吗?”。
通过上面的例子,或许大家都明白了,通过指针查找变量的数据,时间上就相当于,你去一间房子询问主人是谁或者找这位主人。

2、指针的类型

通过第一点的讲解大家都明白了指针的含义,那么指针的类型是什么呢?大家都知道数据是有类型的,同样,指针也是有类型的,它与数据的类型是一致的。一个地址中存放着一个数据,这个数据或许是int,double或者是char,二地址是与这个地址所存的内容以对应的,所以指针的类型就是数据的类型。同样是上面的例子。房子的特点与主人的特点是一致的,有的趋于时尚,那么房子也毫不例外的被时尚的元素所装扮,而趋于稳重的女士或者先生,他的房子也被一些体现稳重的因子所包围。有这一点可知,如果一块内存存储的是int那么对应着这块内存的指针就是int型。由此可以至少得出以下结论:
A:同一个地址在不同时候可以存储不同类型的数据。具体被解释为什么数据类型,这取决他被使用的方式,如果是整数指令,那么这个植被解释为整数,如果使用的是浮点指令,那么就被解释为浮点数。同样,由此结论有可引出另一条重要的结论:不能简单的通过检查一个值的未来判断它的比如有个二进制形式表示的32位值:

01100111011011000110111101100010

下面是这些位被解释的几种结果:
类型                      值
1个32位整数              1735159650
2个16位整数              26476和28514
4个字符                  glob
浮点数                   1.116533*10e24

B:在一个内存中可以存放一个指针,意思就是一个指针可以指向另一个指针,这就是指针的指针。这一点在后面讲述。

现在请看下面的例子:

typedef struct
{
   int a;
   double b;
   struct student c;
}STR;

这里定义了一个结构体。有下面的声明语句:
STR  _a:
STR  *b;
b=&_a;

很明显b指向变量_a所在的地址的首地址,即&_a.a,但是下面的引用却是错误的:
b=&_a.a;
为什么呢?回到上面的知识。b的指针类型是数据类型STR,而&_a.a的类型是int,所以,虽然他们是同一个地址,确实不同的类型!!!
这一点很让新手常常困惑:明明我调用的是同一个地址,为什么老是出错呢?!刚开始时我也是这样,常常不注意指针的类型,或许很多新手像我当初一样根本就没听说指针还有类型!!!

3、未初始化和非法的指针

下面是一段那许多新手都犯的错误,一些老手也是时常不经意犯的错误.
int *a;
/*中间代码*/
*a=1;
这个声明创建了一个a指针变量,随后将1存储在a所指向的内存中。但是这段代码是有BUG的。从上面我们声明了a但是他指向哪里呢?我们不知道,因为我们没对他初始化!所以我们也不知道1存储到那个位置去了!如果你运气好,a的初始值是个非法地址,程序会报错,而中断程序。如果不幸的话,这个指针可能包含一个合法的地址,那么他会覆盖原先这个地址的内容将它改为1,也就是说,当下次你再次访问他时,它的内容就不是原先的内容了,而1!这就是脏数据!而这个指针就是非法指针!
所以未初始化的指针往往是这种错误,这是一种非常隐蔽的错误!很难查找。如果你不懂的这一点那么你会被他整的疯!!!

4、指针的指针
在第二点我们提到过指针的指针。那么他是怎么会是呢?
先看看下面的声明语句:
int a=1;
int *b=&a;

这个声明是说将b指向a变量所在的内存地址。那么再看下面的语句:
int a=1;
int *b=&a;
int **c=&b;

语句中c就是指针的指针。下面我们来解释一下它的含义。*操作符具有从右向左的结合性,所以这个表达式相当于*(*c),那么我们必须从里逐层求值。*c访问c所指向的位置,我们知道这是变量b。第二个间接访问符访问这个位置所指向的地址,也就是变量a。所以按照这种想法,指针的指针并不难懂,只要你留心所有的箭头。

讲这么多感觉也差不多了。总的来说指针的基本知识点也就这些了,这些是非常基础的,通常也是最难的。然而不论怎样只要你时时注意指针的运用,并且有意识的制造某些错误,那么经过这些锻炼,你会感觉自己大有长进。真心祝愿新手们能够领会指针的强大功能!

C和指针(第二版).pdf 立即下载

相关推荐

教程 | 基于遥感生态指数(RSEI)模型的生态环境质量评价

使用数据:Landsat8 OLI数据,行列号:122036,时间:20210527。 使用软件:ENVI5.3、ArcGIS10.2 二、4个指数计算 下述的四个指数的计算均是通过ENVI软件中的Band math工具进行计算。 (1)绿度指数 在常用的植被指数当中,归一化植被指数 ( NDVI) 能够有效地反映植被的生长情况与植被 覆盖度等重要植被的物理性质,检测灵敏度高,能 够较为真实地展现区域的地表空间变化规律,已经得到广泛利用,本文采用 NDVI 指数来代表绿度指数。 在ENV

YW_remote的博客 1万+

c和指针(小白笔记)

c和指针,我在学习c语言过程中的一些感悟,可能有许多错误,请各位大佬多多指教,谢谢,勿喷!

xingguang10的博客 3000

Ubuntu图形界面崩溃?从tty到GUI的终极修复指南

本文提供了Ubuntu图形界面崩溃后进入tty的终极修复指南。详细介绍了如何诊断显示管理器(如LightDM或GDM3)状态,并通过重装、切换显示管理器、修复依赖、系统升级及排查显卡驱动等核心方案,逐步恢复GUI。帮助用户从命令行界面高效修复桌面环境,避免数据丢失。

vulkan6gpu的博客 778

【C语言】C指针详解(含思维导图)

c语言指针介绍

yj20040627的博客 5549

CTF实战:手把手教你用Python破解转轮机加密(附完整脚本)

本文详细介绍了如何使用Python逆向破解转轮机加密,特别针对CTF比赛中的Crypto类题目。通过解析转轮机加密原理、实战Python脚本编写及调试技巧,帮助参赛者快速掌握破解方法,提升在攻防世界等CTF比赛中的解题效率。

silver的专栏 1117

Clock Gating设计陷阱:为什么你的ICG cell总是导致setup violation?(附解决方案)

本文深入分析了数字IC设计中ICG(Integrated Clock Gating)单元导致setup时序违规的常见问题,包括时钟偏斜和数据路径过长两大核心原因。通过量化分析影响因素,提供了逻辑重组、寄存器重定时等优化策略,并介绍了预防性设计方法和物理实现阶段的优化技巧,帮助工程师有效解决ICG相关的setup violation问题。

weixin_29168153的博客 207

c和指针

C和指针 第一章:     1,在逻辑上删除代码而不是注释掉用:         #if 0             statements         #endif     2,#include和#define称为预处理指令,由预处理器解释,预处理器读入源码,根据预处理指令对其修改,然后将修改过的源代码交给编译器。         列如:#include<stdio.h> ;预处理...

ws1296931325的博客 4931

鼎捷T100—二次开发:客制化联络对象维护作业 aooi350

鼎捷T100二次开发,客制化

weixin_52342654的博客 1133

C语言之指针篇【超详细讲解,带你层层深入理解指针】

本篇博客详细讲解了指针部分的内容

一名还在努力学习技术的程序员的博客 3万+

实时多目标跟踪(MOT):SORT与DeepSORT优化

实时多目标跟踪(MOT):SORT与DeepSORT优化​ ,人工智能,计算机视觉,大模型,AI,本文围绕实时多目标跟踪中的 SORT 与 DeepSORT 算法展开,阐述了两者原理、实现及优化。SORT 结合卡尔曼滤波和匈牙利算法,依赖目标检测,实时性好但复杂场景表现欠佳。DeepSORT 在其基础上引入外观特征,采用级联匹配,提升了跟踪精度和鲁棒性。还探讨了两种算法在检测、运动模型、外观特征等方面的优化方向,以及应用场景与选择建议,为相关应用和研究提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 20万+

JAX/JAXlib GPU 加速版本安装教程(CUDA)

本文介绍了在Windows WSL2+Ubuntu22.04环境下配置JAX/JAXlib GPU加速版本的详细步骤。使用RTX 4060显卡,安装CUDA 12.4和cuDNN 8.9.7驱动,通过Miniconda创建Python 3.9虚拟环境。具体步骤包括:安装Miniconda、配置CUDA环境变量、安装cuDNN驱动、下载并安装JAX/JAXlib。最后通过测试代码验证GPU加速功能,成功检测到GPU并完成矩阵运算。整个过程配有详细命令和截图说明,适合需要搭建JAX GPU开发环境的用户参考。

猿小白的博客 629

C和指针:指针

只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针,两个指针相减的结果的类型是 ptrdiff_t,它是一种有符号整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。要求边界对齐的机器上,整型值存储的起始位置只能是特定的字节,通常是2或4的倍数。c声明为浮点数,但是存放在内存中使用的整数,它们可以被解释为整数,也可以被解释为浮点数,取决于它们被使用的方式。a存放的是一个随机的整数,行为未定义。

_ 1962

软考高级信息系统项目管理师系列论文之:百篇软考高级信息系统项目管理师论文范文

软考高级信息系统项目管理师系列论文之:百篇软考高级信息系统项目管理师论文范文

zhengzaifeidelushang的博客 3582

[C和指针] 0. 《C和指针》读书笔记及课后题解汇总

C和指针 该专栏收录了学习《C和指针》书中的大大小小的练习题和个人的学习笔记。一开始本来只想放在 GitHub 上作为自己复习用,但是确实学习过程中比较细致的做了大量笔记和练习,其中不乏许多纰漏和错误,希望能够被各位同学指出,找到错误,共同进步! GitHub 博文地址:Pointers On C。其中包括 源码、pdf 电子图书、英文版答案,供大家学习! 相关博文、笔记 电子书及英文版答案 [C和指针] 1. 赋值运算符函数(编程语言、细节处理、代码优化) [剑指-Offer] 2. 实现S

Y-puyu 的博客 6454

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C语言指针 * 和 & 总结

C语言指针*和&的总结 前言 最近复习了C语言中指针,在网上看了一些资料,发现很多人在解释指针的时候提到了“引用”这个概念,但是C语言是没有这个概念的,大概是在学习时是用来cpp的来学习。所以在这里有一点误会。C语言中是没有引用这个概念的。如果大家在刚开始学习c语言时,尽量用GCC编译器。以免混淆一些概念。 指针 例如在有: int a = 10; int* p = &a; 在定义一个整型变量a后 ,定义一个整型指针p指向a,在这里p中存放的是存放变量a的地址。对于指针,谭

sy1227081317的博客 5345

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言数组之指针数组和数组指针

指针数组指针数组指针数组

weixin_34481217的博客 1万+

拥有优秀作者和优秀译者的优秀的C指针书籍——《征服C指针》

         一本优秀的引进的技术书籍,不仅原作者要优秀,译者的优劣对译本的质量有着显著的影响。在进入正文之前,先评价两点(个人观点): 单从试读章节来看,本书译者除了日文应该掌握的不错意外,其中文文笔功力也非常生厚,译文读起来非常流畅。单从译文来看,目前还没发现错误的地方。我不懂日文,所以不清楚日文翻译中文与英文翻译中文有什么区别,但这本书比市面上的一些书翻译质量高多了。   ...

sunny2038的专栏 1330

C语言进阶——地址和指针

声明二级指针变量的语法数据类型 **变量名数据类型是指二级指针指向的数据的数据类型。双星号(**)是说明符,用于告诉计算机,该变量是二级指针变量。变量名就是二级指针变量的名称,并要符合标识符的命名规则给二级指针变量赋值与给一级指针变量赋值的方式是一样的二级指针变量的基类型由数据类型与双星号( ** )组成。其中双星号 ( ** )表示二级指针变量会通过地址间接跳转两次,然后根据数据类型的长度确定指针访问的数据最终位置。

ld15353133609的博客 1万+

C指针之一:指针和内存

参考书籍《深入理解c指针》 原书作者:Richard Reese 华盛顿州塔尔顿州立大学副教授 如果想在C/C++道路上走的更远,那么必须非常熟悉指针 1、关于指针大小的谣言,指针到底多大? 指针占据内存大小, 64位平台下是8 32位平台下是4 一、指针和内存 1、为什么要精通指针 支持动态分配、快速,高效 2、声明指针 int *pi; 3、如何阅读声明 倒过来读,例如指向常量的指针 cons...

开发笔记 1474

C语言——指针和数组

理解指针的含义;掌握数组的使用;理解指针和数组的联系

Li27的博客 4901

【C语言】数组和指针

数组和指针,十分全面!!

Qiuhan_909的博客 1万+

C语言的行指针和列指针

一、定义二维数组 <1>定义方式 数据类型 数组名[行数][列数]; 例如: int a[3][4]; =====>3行4列 C语言对二维数组采用的这种特殊的定义方式,使得二维数组可以被看作一种特殊的一维数组:它的元素又是一个一维数组。例如: 上图中的a可以看出是一个一维数组,他有3个元素: a[0],a[1],a[2]. 每个元素又包含四个一维数组。 a[0]----------->a[0][0] a[0][1] a[0][2] a[0][3] a[1]------

Danny_llp的博客 5711

C语言 指针数组和指向指针的指针

针对自己在学习指针知识的时候比较难理解,特意整理出来,防止后面忘了,也拿出来供大家理解 指针数组的概念: 一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数 组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。 指针数组说明的一般形式为:类型说明符 *数组名[数组长度] 其中类型说明符为指针值所指向的变量的类型 指针数组类型表示的是多个指针(一组有...

tingguan的博客 9930

[C和指针] ch06. 指针

第六章:指针 GitHub 链接:ch06. 指针 C 语言的精华及难点。 本章总结及注意点 部分课后习题解答 6.17 问题 通过中间编译器,编译器来判断,并创建合适的指令,机器来执行这些指令即可。 内存无法提前预知,此操作意义非常之小,书上已经给了详尽说明。 该值为一个整数,且没有取地址这个符号,则编译器就不生成对应指令,故无法将其解释为地址。 书上讲了。因编译器而异,可能是 0,也能直接崩溃。一定要避免对空指针解引用。 我觉得是没有,但是很明显,考虑的过于片面… 参考答案:

Y-puyu 的博客 1039

c 指针和引用

c 指针和引用引用数组引用和指针的区别指针和引用的区别指向数组的指针和数组指针a 引用数组 int ar[10] ={0}; int (&b)[10] = ar; 声明引用必须在定义时初始化 没有空引用 引用不分等级 没有2/-/4级别引用 引用和指针的区别 三种形参 传值操作 void (int a) 改变x a不变 形参改变实参不变(传值设计) void fun(int a) ...

qq_38684512的博客 1043

C语言指针和函数

希望通过这篇博客,大家能对这些指针相关的概念有更深入的理解,在C语言编程的道路上更加得心应手。回调函数是一种通过函数指针实现的机制,它允许将一个函数作为参数传递给另一个函数,并在适当的时候被调用。通过传递指针,函数可以直接操作调用者提供的变量,而不是操作变量的副本,这在需要修改调用者变量值或处理大型数据结构时尤为重要。这种函数在需要返回一个指向某个数据的指针时非常有用,例如返回动态分配的内存地址或指向全局变量的指针。函数并使用返回的指针输出复制的字符串,最后记得释放动态分配的内存,以避免内存泄漏。

jieyucx的博客 1112
下一篇: Java几种建立实例的方法
Yanortun
博客等级 码龄17年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值