C语言入门篇——指针篇

这篇具有很好参考价值的文章主要介绍了C语言入门篇——指针篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、指针

1.1内存地址

 1.2基地址

1.3指针变量

2、指针类型

2.1指针+-整数

2.2指针的解引用

3、特殊指针

3.1野指针

3.2空指针

4、指针运算

4.1指针-指针

4.2指针的关系运算

5、指针和数组

6、二级指针

7、指针数组


1、指针

1.1内存地址

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效使用内存,就把内存划分一个个小的内存单元,每个内存单元的大小是一个字节

为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址

  • 字节:字节是内存的容量单位,英文称为 byte,一个字节有8位,即 1byte = 8bits
  • 地址:系统为了便于区分每一个字节而对它们逐一进行的编号,称为内存地址,简称地址。

C语言入门篇——指针篇

 1.2基地址

  • 单字节数据:对于单字节数据而言,其地址就是其字节编号。
  • 多字节数据:对于多字节数据而言,期地址是其所有字节中编号最小的那个,称为基地址。

C语言入门篇——指针篇

 变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。这个时候就需要用到取地址符&,在我的操作符篇就有详细介绍过:

(https://blog.csdn.net/sakura0908/article/details/130298670?spm=1001.2014.3001.5501)

 C语言入门篇——指针篇

1.3指针变量

那地址可以作为一种数据来存储吗?C语言告诉我们是可以的,定义一个指针变量来存储地址。

在日常使用中,指针在不同的场合会代表下面几种含义:

  1. 指地址
    • 比如变量a的地址 &a,这是一个地址当然也是一个指针
    • 我们可以说指针 &a 指向变量 a
  2. 指指针变量
    • 比如 int *p; 此处变量p是指针变量,又常被简称指针

总结:指针就是地址,口语中说的指针通常指的是指针变量

指针变量:通过取地址操作符(&)取出变量的内存地址,把地址存放到一个变量中,这个变量就是指针变量。指针变量就是用来存放地址的变量(存放在指针的中的值都被当成地址处理)。

当我们用sizeof计算指针变量的时候,发现在32位系统和64位系统下的大小是不一样的:

C语言入门篇——指针篇

只是为什么呢?

对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电 平(低电压)就是(1或者0); 那么32根地址线产生的地址就会是:

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000001

...

11111111 11111111 11111111 11111111

这里就有2的32次方个地址。每个地址标识一个字节,那我们就可以给 (2^32Byte == 2^32/1024KB == 2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB) 4G的空闲进行编址。

总结:

  1. 在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
  2. 那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

指针的大小在32位平台是4个字节,在64位平台是8个字节。

2、指针类型

在数据篇中介绍了很多C语言中的变量数据类型,指针也是有着不同的类型,

(C语言入门篇——数据篇_sakura0908的博客-CSDN博客)

指针的定义就是:type + *.

char  *pc = NULL;

int   *pi = NULL;

short *ps = NULL;

long  *pl = NULL;

float *pf = NULL;

double *pd = NULL;

2.1指针+-整数

当我们使用指针变量+-整数的时候,程序会给我们返回什么?

C语言入门篇——指针篇

总结:指针的类型决定了指针向前或者向后走一步有多大(距离)

2.2指针的解引用

使用间接运算符有时候被称为解引用(dereferencing)一个指针。指针指向的内存位置被认为存储有一个对象,指针的类型决定了该对象的类型。不要混淆指针声明中的星号(*)和间接运算符。与乘法运算符 * 不同,间接运算符 * 是一元运算符,也就是说,间接运算符只有一个操作数。

解引用 "*"的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,"解"就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为"解引用"。

3、特殊指针

3.1野指针

概念:指向一块未知区域的指针,被称为野指针。野指针是危险的。

野指针产生的原因:

  1. 指针定义时未被初始化:指针在被定义的时候,如果程序不对其进行初始化的话,它会随机指向一个区域,因为任意指针变量(出了static修饰的指针)它的默认值都是随机的
  2. 指针被释放时没有置空:我们在用malloc()开辟空间的时候,要检查返回值是否为空,如果为空,则开辟失败;如果不为空,则指针指向的是开辟的内存空间的首地址。指针指向的内存空间在用free()和delete释放后,如果程序员没有对其进行置空或者其他赋值操作的话,就会成为一个野指针
  3. 指针操作超越变量作用域:不要返回指向栈内存的指针或者引用,因为栈内存在函数结束的时候会被释放。

野指针危害:

  1. 引用野指针,相当于访问了非法的内存,常常会导致段错误(segmentation fault)
  2. 引用野指针,可能会破坏系统的关键数据,导致系统崩溃等严重后果

野指针的规避:

  1. 指针初始化
  2. 小心指针越界
  3. 指针指向空间释放即使置NULL
  4. 避免返回局部变量的地址
  5. 指针使用之前检查有效性

3.2空指针

很多情况下,我们不可避免地会遇到野指针,比如刚定义的指针无法立即为其分配一块恰当的内存,又或者指针所指向的内存被释放了等等。一般的做法就是将这些危险的野指针指向一块确定的内存,比如零地址内存。

C语言入门篇——指针篇

概念:空指针即保存了零地址的指针,亦即指向零地址的指针。

4、指针运算

指针运算有:指针+-整数指针-指针指针的关系运算三种情况。

4.1指针-指针

指针与指针的相减操作,表示两个指针指向的内存位置之间相隔多少个元素(注意是元素,并不是字节数)。例如对于int类型的指针p和p1,p1-p的意义表示他们之间相隔多少个int类型的元素。

同样对于其他类型的指针变量之间相减的意义也是一样。

C语言入门篇——指针篇

4.2指针的关系运算

指针变量之间的关系运算,指的是指向相同类型数据的指针之间进行的关系运算,不同类型的指针之间,或者指针与非0整数之间的比较是没有意义的。

标准规定: 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较。

5、指针和数组

用指针引用数组元素:

引用数组元素可以用“下标法”,除了这种方法之外还可以用指针,即通过指向某个数组元素的指针变量来引用数组元素。数组包含若干个元素,元素就是变量,变量都有地址。所以每一个数组元素在内存中都占有存储单元,都有相应的地址。指针变量既然可以指向变量,当然也就可以指向数组元素。同样,数组的类型和指针变量的基类型一定要相同。

C语言入门篇——指针篇

在数组篇中介绍过(C语言入门篇——数组篇_sakura0908的博客-CSDN博客),除了特殊情况

  1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
  2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

所有的数组名都表示数组首元素的地址。在代码测试案例中:

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,0};
    int *p = arr; //指针存放数组首元素的地址
    int sz = sizeof(arr)/sizeof(arr[0]);

    for(int i=0; i<sz; i++)
   {
        printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p+i);
   }
    return 0;
}

C语言入门篇——指针篇

这说明:可以直接通过指针来访问数组,使用解引用符就可以通过指针来访问数组的内容

6、二级指针

指针变量也是变量,是变量就有地址,那地址变量的地址貌似也可以通过指针变量来存放。那这个指针变量被称之为二级指针(指向指针的指针)。C语言不限制指针的级数,每增加一级指针,在定义指针变量时就得增加一个星号*。实际开发中会经常使用一级指针和二级指针,几乎用不到高级指针。

  • 如果一个指针变量 p1 存储的地址,是另一个普通变量 a 的地址,那么称 p1 为一级指针
  • 如果一个指针变量 p2 存储的地址,是指针变量 p1 的地址,那么称 p2 为二级指针
  • 如果一个指针变量 p3 存储的地址,是指针变量 p2 的地址,那么称 p3 为三级指针
  • 以此类推,p2、p3等指针被称为多级指针

C语言入门篇——指针篇

对于二级指针的运算有:

  • *ppa 通过对 ppa         中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa 
  • **ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a

7、指针数组

指针数组是指针还是数组?指针数组是数组,是存放指针的数组,数组有许多类型,如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组。指针数组的定义形式一般为:

dataType *arrayName[length];

名字解释:

dataType*:数组里每个元素的类型

arrayName:数组名字

length:数组大小 

下列的这个案例代码可以认识和理解指针数组的概念: 

C语言入门篇——指针篇文章来源地址https://www.toymoban.com/news/detail-426540.html

到了这里,关于C语言入门篇——指针篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 引用和指针:内存地址、创建方法及应用解析

    引用变量是对现有变量的“别名”,它是使用 运算符创建的: 现在,我们可以使用变量名 food 或引用名 meal 来引用食物变量: 内存地址 在前一页的示例中,使用 运算符创建了一个引用变量。但它也可以用于获取变量的内存地址;即变量在计算机上存储的位置。 当在 C++ 中

    2024年04月11日
    浏览(35)
  • 【C语言】——认识指针变量和地址,以及指针变量类型的意义

    🎥 岁月失语唯石能言的个人主页         🔥 个人栏专: 秒懂C语言 ⭐ 若在许我少年时,一两黄金一两风      目录 前言 一、指针变量和地址 1.1 取地址操作符() 1.2 指针变量和解引用操作符(*) 1.2.1 指针变量 1.2.2 如何拆解指针类型 1.2.3 解引用操作符 1.3 指针变量

    2024年02月04日
    浏览(59)
  • 【C++干货基地】六大默认成员函数: This指针 | 构造函数 | 析构函数

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 : 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活!   哈喽各位铁汁们好啊,我是博主鸽芷咕《C++干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的城市有没有这种实惠又全面的零食基地呢?C++ 本身作

    2024年03月11日
    浏览(46)
  • 【C语言】-- 一篇带你了解指针,内存,解引用

    目录 1、什么是指针? 1.1 内存 1.2 指针变量 二、指针和指针类型 1、指针类型 2、指针+整数 3、指针的解引用 三、野指针 1、野指针成因 (1) 指针未初始化 (2) 指针越界访问 (3) 指针指向的空间释放 2、如何规避野指针 四、指针运算 1、指针-指针        本篇文章我们来了解C语

    2024年02月16日
    浏览(58)
  • 8.8 【C语言】动态内存分配与指向它的指针变量

    栈:全局变量和局部变量,全局变量是分配在内存中的静态存储区的,非静态的局部变量是分配在内存中的动态存储区的。 堆:数据临时存放在一个特别的自由存储区。 对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这四个函数。 1.用mallo

    2024年02月11日
    浏览(45)
  • 【初识c语言】地址及其内存的简介

    晚钟悠然追为你 回声两度为你作答 暗夜逆流而上 树根在秘密发电 你的果园亮了 我径直走向你 带领所有他乡之路 当火焰试穿大雪 日落封存帝国 大地之书翻到此刻 ————节选 北岛《路歌》 一. 内存的简介: 在计算机的组成结构中,有一个很重要的部分,就是 储存器 。

    2024年02月02日
    浏览(40)
  • 【C++干货基地】深度理解C++中的高效内存管理方式 new & delete

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 : 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活!   哈喽各位铁汁们好啊,我是博主鸽芷咕《C++干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的城市有没有这种实惠又全面的零食基地呢?C++ 本身作

    2024年04月26日
    浏览(41)
  • 【C语言深度解剖】float变量在内存中存储原理&&指针变量与“零值”比较

    大家好好我是沐曦希💕 根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式: (-1)^S * M * 2^E (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。 M表示有效数字,大于等于1,小于2。 2^E表示指数位。 例如: 十进制中的5.0转换成二进制

    2024年02月14日
    浏览(41)
  • C语言——指针(入门详解)

    1.指针是内存中最小单元的编号,也就是地址。 2.平时口语中的指针,通常指的是指针变量,指针变量是用来存放内存地址的变量。 总结 :指针其实就是地址,口语中的指针通常指的是指针变量。 补充:一个内存单元占一个字节。 通过取地址操作符取出变量在内存中的起始

    2024年02月05日
    浏览(44)
  • C语言指针快速入门

    简单的说指针用于表示地址,存放的是一个地址 获取num值的本质是通过变量找到变量对应的地址,在从地址找到空间把值取出来。 num的值是=1 num 地址 =0x7ffc7fc18f2c ptr的地址是0x7ffc7fc18f20 printf(“nptr的地址是%p ptr存放的值是一个地址为%p”,ptr,ptr); ptr这个空间存储的值是num的指

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包