【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针

这篇具有很好参考价值的文章主要介绍了【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针,0基础C语言,c语言,算法,数据结构,开发语言,学习

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发


Hello,这里是君兮_,今天继续给大家更新0基础入门C语言的内容,我们这次主要更新的依然是初阶指针的基础知识

  • 废话不多说咱们直接开始吧!!

一. 野指针

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

1. 野指针成因

    1. 指针未初始化
#include <stdio.h>
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
  *p = 20;
return 0;
}
    1. 指针越界访问
#include <stdio.h>
int main()
{
  int arr[10] = {0};
  int *p = arr;
  int i = 0;
  for(i=0; i<=11; i++)
 {
    //当指针指向的范围超出数组arr的范围时,p就是野指针
    *(p++) = i;
 }
  return 0;
  }
    1. 指针指向的空间释放
  • 这里放在指针进阶篇中动态内存开辟的时候讲解

2. 如何规避野指针

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

第三种情况的使用例子

#include <stdio.h>
int main()
{
  int *p = NULL;//在使用前先把指针置空防止为释放指针之前指向的空间
  //....
  int a = 10;
  p = &a;
  if(p != NULL)
 {
    *p = 20;
 }
  return 0;
  }

二. 指针运算

1.指针± 整数

#define m 5
float values[m];
float* vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[m];)
{
    *vp++ = 0;//把values数组中每个元素都初始化为0,这里指针++表示地址后移
}

2.指针-指针

//计算字符串的长度
int my_strlen(char *s)
{
   char *p = s;
   while(*p != '\0' )
       p++;
   return p-s;//当p中读取到\0时说明该字符串总长度为此时的地址p-首元素地址s
   }

3.指针的关系运算

for(vp = &values[m]; vp > &values[0];)
{
  *--vp = 0;//由于是前置--,最后会与第一元素之前的元素比较
}

  • 上面这段代码有比较明显的缺点,我们来简化一下。
for(vp = &values[m-1]; vp >= &values[0];vp--)
{
  *vp = 0;
}
  • 实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。
  • 标准规定:
  • 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

三. 指针和数组

  • 我们先通过一个例子来建立一下数组与指针之间的联系
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
  printf("%p\n", arr);//打印地址
  printf("%p\n", &arr[0]);
  return 0;

【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针,0基础C语言,c语言,算法,数据结构,开发语言,学习

  • 我们可以发现两者的地址是相同的
  • 可见数组名和数组首元素的地址是一样的。
  • 结论:
  • 数组名表示的是数组首元素的地址。(2种情况除外,在之前的博客中讲过,链接如下:【C语言初阶】带你玩转C语言中的数组,并逐步实现冒泡排序,三子棋,扫雷)
  • 那么这样写代码是可行的:
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr;//p存放的是数组首元素的地址
  • 既然可以把数组名当成地址存放到一个指针中,我们就可以使用指针来访问一个数组。
  • 示例如下:
#include <stdio.h>
int main()
{
  int arr[] = {1,2,3,4,5,6,7,8,9,0};
  int *p = arr; //指针存放数组首元素的地址
  int sz = sizeof(arr)/sizeof(arr[0]);
  int i;
  for(i=0; i<sz; i++)
 {
    printf("&arr[%d] = %p  <====> p+%d = %p\n", i, &arr[i], i, p+i);
    }
    return 0;
 }

【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针,0基础C语言,c语言,算法,数据结构,开发语言,学习

  • 所以 p+i 其实计算的是数组 arr 下标为i的地址。
    那我们就可以直接通过指针来访问数组
  • 示例如下:
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i<sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}

四.二级指针

  • 指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
  • 答案不言而喻—— 二级指针 。

int main()
{
    int a = 10;
    int* p = &a;
    int** pa = &p;
    printf("%d\n", a);
    printf("%d\n", *p);
    printf("%d\n", **pa);
    return 0;
}

【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针,0基础C语言,c语言,算法,数据结构,开发语言,学习

  • 我们可以看出来三者的值是相同的!!

  • 对于二级指针的运算有:

 //*pa通过对pa中的地址进行解引用,这样找到的是p ,*pa 其实访问的就是p .
int b = 20;
*pa = &b;//等价于 p = &b;
//**pa 先通过* pa 找到 p, 然后对 p 进行解引用操作:*p ,那找到的是 a .
**pa = 30;
//等价于*p = 30;
//等价于a = 30;

五. 指针数组

  • 指针数组是指针还是数组?
  • 是数组。是存放指针的数组。

数组我们已经知道整形数组,字符数组。

int arr1[5];
char arr2[6];
  • 那指针数组是怎样的?
int* arr3[5];//是什么?
  • arr3是一个数组,有五个元素,每个元素是一个整形指针。
    【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针,0基础C语言,c语言,算法,数据结构,开发语言,学习
  • 还有一种指针类型叫做数组指针,是指针,这两种情况我都会放在指针进阶篇中介绍。

总结

  • 今天的内容到这里就全部结束了,我们今天把指针基础部分全部介绍完了,其中主要包括野指针的定义以及如何避免,指针运算的几种形式以及指针与数组的关系和二级指针,希望大家把博客中的代码都弄懂哦!

  • 好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针,0基础C语言,c语言,算法,数据结构,开发语言,学习文章来源地址https://www.toymoban.com/news/detail-586210.html

到了这里,关于【C语言初阶】带你轻松掌握指针基础知识完结篇——野指针,指针运算,指针和数组,二级指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 掌握C语言指针,轻松解锁代码高效性与灵活性(中)

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 前面给大家介绍了一些指针的基本概念,今天就让我们继续深入指针的世界,和贝蒂一起打败指针大魔王吧 指针变量也是变量,是变量就有地址,那我们

    2024年03月09日
    浏览(46)
  • 掌握C语言指针,轻松解锁代码高效性与灵活性(下)

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 经过前面的刻苦学习,今天我们终于来到了指针的最后一节,这一节将是对前面内容的总结与深化,相信学完之后,大家能对指针有一个更深的理解~ 函数

    2024年03月09日
    浏览(67)
  • 《C语言初阶篇》循环语句还没搞懂?这篇文章带你轻松学会循环语句!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,又是新的一天开始了,今天给大家带来的循环语句的全面讲解!    ⛳️ 历时一天终于给肝出来了,本文详细讲解了wh

    2024年02月15日
    浏览(47)
  • 【C语言初阶】带你轻松玩转所有常用操作符(1) ——算数操作符,移位操作符,位操作符

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,这里是君兮_,最近要准备期末复习了,可能更新的就不会那么频繁了,下个星期恢复正常更新。 今天给大家带来的是操作符详解,由于这部分的内容比较多,可能会分成几部分讲,今天带来的是第一部分的内容,废

    2024年02月11日
    浏览(46)
  • C语言初阶测评题:测试你的基础知识和编程技能!!

    💓博客主页:江池俊的博客 ⏩收录专栏:C语言刷题专栏 👉专栏推荐:✅C语言初阶之路 ✅C语言进阶之路 💻代码仓库:江池俊的代码仓库 🎉欢迎大家点赞👍评论📝收藏⭐ 🎈前言: 欢迎来到这个关于C语言的初阶测评题博客!在这里,我们将为您呈现一系列考察基础知识

    2024年02月11日
    浏览(37)
  • DS作业0-C语言基础知识复习(含指针与链表)

    判断题: 1.直接访问就是直接利用变量的地址直接进行访问。T 2.可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。T 3.int (*p)[4]它表示p是一个指针数组,它包含4个指针变量元素。F (是int类型数组,里面有4个指针变量元素) 4.结构体变量可以作数组元素。

    2024年02月04日
    浏览(44)
  • 【05】STM32·HAL库开发-C语言基础知识 | stdint.h介绍 | 位操作 | 宏定义的使用 | 条件编译 | extern声明 | typdef使用 | 结构体、指针、代码规范介绍。

      stdint.h 是从 C99 中引进的一个标准 C 库的文件,可以在MDK5的安装路径:D:MDK5.34ARMARMCCinclude中找到。   stdint.h 定义了很多类型别名,将有符号的char类型定义别名为int8_t等,使用此套别名有易于移植。   在MDK中需要配置才能支持使用S99标准, 默认是勾选的 。   只

    2024年02月08日
    浏览(44)
  • 【C语言初阶(八)】初阶指针详解

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 我们在介绍C语言时已经给大家介绍过指针的概念以及内存地址的概念了,这里我们就不再重复说明前面的内容,对指针毫无了解的

    2024年02月09日
    浏览(47)
  • 【C语言】初阶指针(指针及其类型以及野指针)

    简单不先于复杂,而是在复杂之后。 目录 1. 指针是什么? 2. 指针和指针类型  2.1  指针+-整数 2.2 指针的解引用  3. 野指针  3.1 野指针成因  3.2 如何规避野指针  指针理解的两个要点: 1. 指针是内存中最小单元的编号,也就是地址。 2. 平时口语中说的指针,通常指的是指

    2023年04月16日
    浏览(51)
  • 【C语言】初阶指针

    指针是一种用来存储变量地址的变量类型。它可以指向任何数据类型,包括基本数据类型(如整数、字符等)和复合数据类型(如数组、结构体等)。通过指针,我们可以间接地访问或修改存储在特定内存地址上的数据。 指针是内存中一个最小单元的编号,也就是地址。 平

    2024年02月12日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包