广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言指针的图文详解
  • 706
分享到

C语言指针的图文详解

2024-04-02 19:04:59 706人浏览 安东尼
摘要

目录指针是什么?指针和指针变量1. 指针类型决定了指针进行解引用操作的时候,能访问空间的大小2. 指针加减整数野指针野指针的成因指针和数组二级指针指针数组、数组指针总结指针是什么?

指针是什么?

指针(Pointer)是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。

换句话说就是可以通过指针找到以它为地址的内存单元。

理解:内存图解。

image-20220101191356913

指针是个变量,存放内存单元的地址(编号)。

int main(){
    int a = 10;//在内存中开辟空间存储
    int* p = &a;//先对变量a取出它的地址,可以使用&操作。
    			//将a的地址存放在p变量中国,p就是一个指针变量
}

小结:指针就是变量,内容是地址。(存放在指针中的值被当做地址处理)

指针的大小

  • 在32为计算机上指针大小4字节。
  • 在64为计算机上指针大小8字节。

指针和指针变量

关于地址

printf("%p \n",&a);//%p地址格式   &a取a的地址
int* p = &a;
//int*指针类型 
//p 指针变量 
//&a 取地址

使用

*p //解引用操作符
int a =10;  //在内存中存储10   还有char*等类型
int* p = &a;//定义指针,位置为a的内存
*p = 20;    //更改指针指向内存的 值
printf("a= %d",a);//结果为a=20

int* p的理解 p是int类型的一个指针(仅此而已),一般*p指向的也是一个int型的

1. 指针类型决定了指针进行解引用操作的时候,能访问空间的大小

int main(){
    int n = 0x112233;
    char* p = (char*)&n;
    int* pi = &n;
    *pc = 0;  //在调试的过程中观察内存的变化。
    *pi = 0;
    return 0;
}
int*;  *p可以访问4个字节。
char*; *p可以访问1个字节。
double*;  *p可以访问8个字节。

原因 是类型本身所需的内存空间就是指针可以控制的空间。

意义:使用时选用合适的指针类型进行定义

2. 指针加减整数

int main(){
    int a = 0x11223344;
    int* p1 = &a;
    char* p2 = &a;
    printf("%p\n",p1);
    printf("%p\n",p1+1);
    printf("%p\n",p2);
    printf("%p\n",p2+1);
    return 0;
}

image-20220103173241655

int类型时0C->10 变化4, char类型时0C->0D 变化1。

理解:指针加一不是指向下一个紧挨着的地址,是指向下一个指针变量对应的类型变量开始的地址。

意义 指针类型决定了:指针走一步走多远(指针的步长)

野指针

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

野指针的成因

1.指针未初始化

int main(){    int a;//局部变量不初始化,默认是随机值    int *p;//局部的指针变如果没有初始化,就被初始化为随机值。}int main(){
    int a;//局部变量不初始化,默认是随机值
    int *p;//局部的指针变如果没有初始化,就被初始化为随机值。
}

2.指针越界访问

int main(){
    int arr[10];
    int *p = arr;
    for(int i = 0;i<12;i++){
        p++;
    }
    //当指针的范围超出数组的范围时,p就是野指针。
}

3.指针指向的空间释放

int main(){
    int arr[10];
    int *p = arr;
    for(int i = 0;i<12;i++){
        p++;
    }
    //当指针的范围超出数组的范围时,p就是野指针。
}

解析:在main函数调用test()时,进入test()函数,int a语句开辟临时的内存空间并将这个内存空间存储为10;返回函数的时候返回的临时的a的地址给*p,然后test函数已经在执行完test函数后结束,a的内存空间被销毁。这时的*p就是指向的地址正确但是内容已经改变。

将未知位置的值进行修改是非常危险的

如何避免野指针

1.指针初始化

2.小心指针越界

3.指针指向内存释放 即 指向NULL

4.指针只用之前检查有效性

指针运算

1.指针加减整数

2.指针-指针

3.指针的关系运算

指针加减指针

int main(){
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int sz = sizeof(arr)/sizeof(arr[0]);
    int* p = arr;
    for(int i=0;i<sz;i++){
        printf("%d ",*p);
        p = p+1;// p++
    }
    int* p = &arr[9];
    for(int i=0;i>0;i++){
        printf("%d ",*p);
        p-=1;// p++
    }
    return 0;
}

指针-指针

int main(){
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    printf("%d",&arr[9]-&arr[0]);//输出9   中间元素的个数。
    printf("%d",&arr[0]-&arr[9]);//输出-9  
    return 0;
}

指针减指针必须是自己减去自己。否则结果不可预知。

指针实现strlen()

int my_strlen(char* str){
    char* start = str;
    char* end = str;
    while(*end != '\0'){
        end++;
    }    
    return ;
}
int main(){
    char arr[] = "hello";
    int len = my_strlen(arr);
    printf("%d\n",len);
    return 0;
}

指针的关系运算

int main(){
    float values[5];
    for(float* vp=&values[5];vp>&values[0];){
        printf("haha ");
        *--vp = 0;
    }
    return 0;
}

这里碰到了两个问题 1. values[5]本身不属于数组的部分。但是可以使用。经测试values[5]不会警告,但是values[-1]及以下或values[6]及以上都会报错。2.指针的加减是类型位置的移动数组总也就是一个一个往过走。

for(float* vp=&values[5-1];vp>=&values[0];vp--){
    printf("haha ");
    *vp = 0;
}

这里在绝大多数的编译器上是可以顺利完成任务的,然而我们应该避免这第二种写法,因为标准不能保证他是可行的。

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

指针和数组

int main(){
    int arr[10]={0};
    printf("%p\n",arr);  //地址-首元素地址
    printf("%p\n",&arr[0]);
}

一般情况数组名都代表首元素的地址

除了:

1. &数组名 这时数组名代表整个数组的地址

2. sizeof(数组名) 这时也是代表整个数组。

二级指针

将第一层指针1想成变量,再取这个变量的地址存为一个指针2。那么指针2指向指针1,指针1指向原变量。原变量的地址存在了指针1中,指针1的地址存在了指针2中。

int main(){
    int a = 10;
    int* pa = &a;
    int** ppa = &pa;//ppa就是二级指针。
    //存在三级及以上指针,(无限套娃)
}

指针数组、数组指针

指针数组其实是个数组,数组指针是个指针

指针数组:存放指针的数组

int a = 10;
int b = 20;
int c = 30;
int* arr[3] = {&a,&b,&c};//指针数组

数组指针:指向数组的指针。

main(){
int a = 10;
int* pa = &a;
int** ppa = &pa;//ppa就是二级指针。
//存在三级及以上指针,(无限套娃)
}


### 指针数组、数组指针

指针数组其实是个数组,数组指针是个指针

<u>**指针数组**</u>:存放指针的数组

~~~c
int a = 10;
int b = 20;
int c = 30;
int* arr[3] = {&a,&b,&c};//指针数组

数组指针:指向数组的指针。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C语言指针的图文详解

本文链接: https://www.lsjlt.com/news/161804.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言指针的图文详解
    目录指针是什么?指针和指针变量1. 指针类型决定了指针进行解引用操作的时候,能访问空间的大小2. 指针加减整数野指针野指针的成因指针和数组二级指针指针数组、数组指针总结指针是什么? ...
    99+
    2022-11-12
  • C语言指针详解
    目录前言:复杂类型说明一、细说指针1.指针的类型2.指针所指向的类型3.指针的值----或者叫指针所指向的内存区或地址4 指针本身所占据的内存区二、指针的算术运算三、运算符&...
    99+
    2022-11-12
  • C语言指针详解之野指针
    目录指针是什么?怎么表示?什么是指针变量?指针类型又是什么?指针类型存在的意义野指针是什么?野指针产生的原因一、 指针未初始化二、 指针越界访问如何避免野指针(野狗)的出现呢?指针运...
    99+
    2022-11-12
  • C语言的空类型指针,空指针,野指针详解
    目录空类型指针-void*空指针-NULL野指针造成野指针的原因1.指针未初始化2.指针越界访问3.指针指向的空间已经释放避免野指针总结空类型指针-void* void是空类型,vo...
    99+
    2022-11-12
  • C语言函数指针详解
    目录Introduction函数指针 Function PointersExercise 1:qsort中的函数指针Exercise 2:总结Introduction 上一个lab的...
    99+
    2022-11-12
  • C语言指针基础详解
    目录1.1:概述1.1.1:内存1.1.2:内存1.1.3:指针和指针变量1.2:指针基础知识1.2.1:指针变量的定义和使用1.2.2:通过指针间接修改变量的值1.2.3:指针的大...
    99+
    2022-11-12
  • c语言的指针数组详解
    指针如何指向数组,并读取数组中的元素: #include <stdio.h> int main() { int arr[3] = {1,2,3}; int *p;...
    99+
    2022-11-12
  • 详解C语言的void*空指针
    目录void的应用空指针类型(void*)总结在C语言中,void称为无类型,相应的void*称为无类型指针或者空指针类型。 void的应用 对函数返回值的限定。 例如void fu...
    99+
    2022-11-13
  • 详谈C语言指针
    #include<stdio.h> int main() { int a = 10; int b = 20; int* p = &a;//*定义指针变量...
    99+
    2022-11-12
  • C语言的数组指针与函数指针详解
    目录前言函数指针语法数组指针与指针数组总结前言 数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用。 函数指针语法 定义一个函数指针,并通...
    99+
    2022-11-13
  • C语言中的初阶指针详解
    目录1.指针是什么2.指针和指针类型3.野指针3.1野指针成因3.2如何规避野指针4.指针的运算4.1指针±整数4.2指针-指针4.3指针的关系运算5.指针和数组6.二级指针7.指针...
    99+
    2022-11-12
  • C语言指针数组案例详解
    指针与数组是 C 语言中很重要的两个概念,它们之间有着密切的关系,利用这种 关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之 间的联系及在编程中的应用。 1.指...
    99+
    2022-11-12
  • C语言 指针数组进阶详解
    目录指针与数组中的sizeof与strlensizeofstrlen数组名1、一维数组整型数组字符数组指针数组2、二维数组指针笔试题 笔试题1笔试题2笔试题3笔试题4笔试题...
    99+
    2022-11-13
  • C语言指针教程示例详解
    目录指针内存指针类型指针运算二级指针指针数组指针 指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作...
    99+
    2022-11-13
  • C语言基础指针详解教程
    目录1.1:概述1.1.1:内存1.1.2:内存1.1.3:指针和指针变量1.2:指针基础知识1.2.1:指针变量的定义和使用1.2.2:通过指针间接修改变量的值1.2.3:指针的大...
    99+
    2022-11-12
  • C语言的指针类型详细解析
    指针存储了内存的地址,同时指针是有类型的,如int*,float*,那么,一个自然的猜想就是指针变量应该存储这两方面的信息:地址和指针类型,比如,就像下面的结构体:复制代码 代码如下...
    99+
    2022-11-15
    C语言 指针类型
  • C语言中二级指针解析(指向指针的指针)
    目录二级指针(指向指针的指针)二级指针的定义与理解二级指针定义格式二级指针赋值实例二级指针(指向指针的指针) 指针可以指向一份普通类型的数据,例如 int、double、char 等...
    99+
    2022-11-13
  • C语言指针的详细介绍
    这篇文章主要介绍“C语言指针的详细介绍”,在日常操作中,相信很多人在C语言指针的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指针的详细介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!目录...
    99+
    2023-06-20
  • C语言指针详细介绍
    本篇内容主要讲解“C语言指针详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言指针详细介绍”吧!指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机...
    99+
    2023-06-15
  • C语言返回值指针的函数详解
          #include<stdio.h> void main() { int a[5] = { 1,3,5,7,9 }; ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作