深入浅出理解C语言指针的综合应用

目录
  • 指针是什么?
  • 指针变量
  • 使用指针变量的例子
  • 通过指针引用数组
  • &数组名vs数组名
  • 野指针
  • 野指针成因
    • 1.指针未初始化
    • 2.指针越界访问
  • 如何避免野指针
  • 指针运算

指针是什么?

指针是c语言中的一个重要概念,也是C语言的一个重要的特色,正确而灵活地运用它,可以使程序简洁,紧凑,高效,每一个学习和使用c语言的人,都应当深入了解地学习和掌握指针,可以说,不掌握指针就是没有掌握C的精华也可以说

指针是C语言的灵魂(doge)

由于通过地址能找到所需的变量单元,可以说,地址指向变量单元,打个比方,一个房间的门口挂了一个房间号2008,这个2008就是房间的地址,或者说,2008"指向"该房间.因此,将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元!

指针变量

使用指针变量的例子

例  通过指针变量访问整型变量

int main() {
    int a = 100, b = 10;//定义整型变量a,b并初始化
    int* p1, * p2;     //定义指向整型数据的指针变量p1,p2;
    p1 = &a;          //把变量a的地址赋给指针变量p1
    p2 = &b;         //把变量a的地址赋给指针变量p2
    printf("a=%d,b=%d\n", a, b);//输出变量a和b的值
    printf("*p1=%d,*p2=%d\n", *p1, *p2);
        }

运行结果:

在开头处定义了两个指针变量p1和p2。但此时他们并未指向任何一个变量,只是提供两个指针变量,规定他们可以指向整型变量,至于指向哪一个整型变量,要在程序中指定.。程序第五第六行的作用就是使p1指向a,使p2指向b,此时p1的值为&a(即a的地址),p2的值为&b(即为b的地址)

*注意:定义指针变量时,左侧应有类型名,否则就不是定义指针变量.

例如:

通过指针引用数组

所谓数组元素的指针就是数组元素的地址

可以用一个指针变量指向一个数组元素。例如

int arr[10]={1,3,5,7,9,11,13,15,17,19}; //定义a为包含10个整型的数组
int *p;                                //定义p为指向整型变量的指针变量
p=&a[0];                               //把a[0]元素的地址赋给指针变量p

&数组名vs数组名

int arr[10];

我们知道arr是数组名,数组名表示数组收元素的地址。

那么问题来了 &arr数组名到底是什么呢??

不如我们来段代码吧!

由此可以得出数组名和&数组名打印的地址是一样的。

我们再来看一段代码!

根据代码我们发现,其实&arr和arr,虽然值是一样的,但是意义应该不一样

实际上&arr表示的是数组的地址而不是数组首元素的地址。

数组的地址+1 跳过整个数组的大小,所以&arr+1相对于&arr的差值是40.

野指针

概念:野指针就是指针指向的位置是不可知的,(随机性的丶不正确的丶没有明确限制的)

野指针成因

1.指针未初始化

2.指针越界访问

如何避免野指针

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

指针运算

小时候我们就知道1+1等于几 那我问你如果是指针加1的话 加的是那个数字吗 ?

下面来看一段代码:

这里我们可以发现p跟p+1相差1

这里c是多少呢 ?

16进制的C的10进制是12,所以q+1和q相差4

p是整型指针相当于sizeof(int)=4

q是字符型指针相当于sizeof(char)=1;

以上就是我归纳指针的一些小结 如果能帮助友友们

到此这篇关于深入浅出理解C语言指针的综合应用的文章就介绍到这了,更多相关C语言 指针内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于C语言中野指针的深入解析

    "野指针"的成因主要有两种:(1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存.例如 复制代码 代码如下: char *p = NULL;     char *str = (char *) malloc(100); (2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针.参见7.5节.别看free和dele

  • C语言指针详解之野指针

    目录 指针是什么? 怎么表示? 什么是指针变量? 指针类型又是什么? 指针类型存在的意义 野指针是什么? 野指针产生的原因 一. 指针未初始化 二. 指针越界访问 如何避免野指针(野狗)的出现呢? 指针运算 总结 指针是什么? 指针只是一个名词而已,指针就是地址. 我们平时说指针,也可以指指针变量. 怎么表示? 类型名 指针变量 = 地址: 例如:int* pa = &a: //我们这里的指针类型叫做int*,我读做(yin te 星号). //pa是指针变量 这段表达式的意思是:定义了一个指针

  • C语言之free函数以及野指针介绍

    [FROM MSDN && 百科]原型:void free(void *ptr);#include<stdlib.h>或#include <malloc.h>Deallocate space in memory释放ptr指向的存储空间.被释放的空间通常被送入可用存储区池,以后可在调用malloc.realloc以及realloc函数来再分配.注意:连续两次使用free函数,肯定会发生错误.malloc的次数要和free的次数相等.A block of memory

  • C语言的空类型指针,空指针,野指针详解

    目录 空类型指针-void* 空指针-NULL 野指针 造成野指针的原因 1.指针未初始化 2.指针越界访问 3.指针指向的空间已经释放 避免野指针 总结 空类型指针-void* void是空类型,void*是空类型指针,又叫万能指针,就是该指针能接收任意类型的指针,可以指向任何类型对象,所以不能对空类型指针进行解引用,必须强制类型转换成相应的指针类型,才能进行解引用操作. 空指针类型: 作为函数形参类型,可以接收任意类型的指针: 作为函数返回值类型,在函数外面,将其强制类型转换为相应的指针类型

  • C语言 野指针与空指针专篇解读

    一:野指针 概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的). 说明:指针变量也是变量,是变量就可以任意赋值.但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域). 注:野指针不会直接引发错误,操作野指针指向的内存区域才会出问题. 代码示例: int a = 100; int *p; p = a; //把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义 p = 0x12345

  • C语言基础野指针与空指针示例分析

    目录 一:野指针 1.1 :野指针的成因 2.1 :规避野指针 1. 初始化指针 2. 避免指针越界 3 避免返回局部变量的地址 4. 开辟的指针释放后置为NULL 5. 养成良好的编程习惯 二:空指针 一:野指针 概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的). 说明:指针变量也是变量,是变量就可以任意赋值.但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域). 注:野指针不会直接引发错误

  • 深入浅出理解C语言指针的综合应用

    目录 指针是什么? 指针变量 使用指针变量的例子 通过指针引用数组 &数组名vs数组名 野指针 野指针成因 1.指针未初始化 2.指针越界访问 如何避免野指针 指针运算 指针是什么? 指针是c语言中的一个重要概念,也是C语言的一个重要的特色,正确而灵活地运用它,可以使程序简洁,紧凑,高效,每一个学习和使用c语言的人,都应当深入了解地学习和掌握指针,可以说,不掌握指针就是没有掌握C的精华也可以说 指针是C语言的灵魂(doge) 由于通过地址能找到所需的变量单元,可以说,地址指向变量单元,打个比方,

  • 深入浅出理解C语言初识结构体

    目录 1.定义和使用结构体变量 结构体的基础知识 自己建立结构体类型 struct 结构体名 类型名 成员名: 声明结构体的形式 结构体的初始化 2. 结构体成员的访问 3.结构体传参 1.定义和使用结构体变量 结构体的基础知识 结构是一些值的集合,这些值称为成员变量.结构的每个成员可以是不同类型的变量. 自己建立结构体类型 结构的成员可以是标量.数组.指针,甚至是其他结构体. struct 结构体名 {成员表列}:↓ 注意:结构体类型的名字由一个关键字 struct 和结构体名组合而成的(例如

  • 深入理解C语言指针及占据内存空间

    原文链接:https://www.cnblogs.com/l-hh/p/12288613.html 第一.了解内存空间 本文章文字有点多,会有点枯燥,配合图文一起看可以缓解枯燥,耐心阅读哦!!! 先了解内存地址,才更好的理解指针! 我们可以把内存想象为成一列很长很长的货运火车,有很多大小相同的车厢,而每个车厢正好相当于在内存中表示一个字节.这些车厢装着不同的货物,就像我们的内存要存着各式各样的数据. 多啰嗦一下 我们平时在电脑上能够听音乐.看视频和文章,其实看到的这些东西就是内存中每个"车厢&q

  • 深入理解C语言指针

    指针是一种数据类型 指针也是一种变量,占有内存空间,用来保存内存地址 指针就是告诉编译器,开辟4个字节的存储空间(32位系统),无论是几级指针都是一样的 *p操作内存 在指针声明时,* 号表示所声明的变量为指针 在指针使用时,* 号表示操作指针所指向的内存空间中的值 *p相当于通过地址(p变量的值)找到一块内存:然后操作内存 *p放在等号的左边赋值(给内存赋值) *p放在等号的右边取值(从内存获取值) 指针变量和它指向的内存块是两个不同的概念 给p赋值p = 0x1111;只会改变指针变量值,不

  • C语言 指针综合解析

    目录 指针总结 1.指针的本质 1.1 指针的定义 1.2 取地址操作符与取值操作符 2.指针的使用场景 2.1 指针的传递 2.2 指针的偏移(指针的加减) 2.3 指针与自增.自减运算符 2.4 指针与一维数组 2.5 指针与动态内存申请(malloc) 2.6 字符指针与字符数组的初始化 3.二级指针 3.1 二级指针的传递 指针总结 部分笔记来源于王道C语言训练营 指针:变量的地址 指针变量:一个变量专门用来存放另一变量的地址 1.指针的本质 1.1 指针的定义 通过取地址(指针)直接访

  • 深入理解C语言中使用频率较高的指针与数组

    目录 定义 指针与二维数组 指针数组与数组指针 数组指针的应用 操作 总结 定义 指针:C语言中某种数据类型的数据存储的内存地址,例如:指向各种整型的指针或者指向某个结构体的指针. 数组:若干个相同C语言数据类型的元素在连续内存中储存的一种形态. 数组在编译时就已经被确定下来,而指针直到运行时才能被真正的确定到底指向何方.所以数组的这些身份(内存)一旦确定下来就不能轻易的改变了,它们(内存)会伴随数组一生. 而指针则有很多的选择,在其一生他可以选择不同的生活方式,比如一个字符指针可以指向单个字符

  • C语言指针详解及用法示例

    新手在C语言的学习过程中遇到的最头疼的知识点应该就是指针了,指针在C语言中有非常大的用处.下面我就带着问题来写下我对于指针的一些理解. 指针是什么? 指针本身是一个变量,它存储的是数据在内存中的地址而不是数据本身的值.它的定义如下: int a=10,*p; p=&a int a=10; int *p=&a; 首先我们可以理解 int* 这个是要定义一个指针p,然后因为这个指针存储的是地址所以要对a取地址(&)将值赋给指针p,也就是说这个指针p指向a. 很多新手都会对这两种定义方法

  • C语言指针的长度和类型深入分析

    指针是C语言的精髓,本文就以实例的形式详细分析了C语言的长度和类型.对于初学者深入理解C语言程序设计有很好的参考价值.具体分析如下: 一般来说,如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样.但是函数指针长度可能与数据指针的长度不同. 指针的长度取决于使用的机器和编译器,例如:在现代windows上,指针是32位或是64位长 测试代码如下: #inclu

  • C 语言指针变量详细介绍

    数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量. 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.指针变量的值就是某份数据的地址,这样的一份数据可以是数组.字符串.函数,也可以是另外的一个普通变量或指针变量. 现在假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示).另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我

  • C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及对比 通俗理解数组指针和指针数组 数组指针: eg:int( *arr)[10]; 数组指针通俗理解就是这个数组作为指针,指向某一个变量. 指针数组: eg:int*arr[10]; 指针数组简言之就是存放指针的数组: --数组并非指针&&指针并非数组 (1)定义一个外部变量: eg:int value=10; int *p=&value; 举例:当需要在一个函数中用这个变量时:externa int*p;而非extern int p[]; 分析:当用:e

随机推荐