C语言第十三课--------初阶指针的认识--------重要部分

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

作者前言

🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂

   🎂      作者介绍:                              🎂🎂

       🎂 🎉🎉🎉🎉🎉🎉🎉              🎂

          🎂作者id:老秦包你会,         🎂

简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

             喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨         🎂🎂🎂🎂🎂🎂🎂🎂

                 🎂个人主页::小小页面🎂

                  🎂gitee页面:秦大大🎂

                   🎂🎂🎂🎂🎂🎂🎂🎂
        🎂  一个爱分享的小博主 欢迎小可爱们前来借鉴🎂

_______________________________________________________

______________________________________________________________________

目录

1. 指针是什么
2. 指针和指针类型
3. 野指针
4. 指针运算
5. 指针和数组
6. 二级指针
7. 指针数组
________________________________________________________

插播小知识

1.全局变量,没有给初始值时,编译其会默认将其初始化为0。局部变量必须初始化。如int a;

2.'\0'是/ddd ,就是0

3.数组名是一个常量,不能++,相当于5++是错的,如果存放到一个变量里面,变量就可以++,

指针是什么

1. 指针是内存中一个最小单元的编号,也就是地址
2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量
C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言
#include <stdio.h>
int main()
{
	int a = 10;//是向内存中栈区空间申请4个字节的空间,这4个字节用来存放10这个数值
	int* p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。a变量占用4个字节的空间,这里是将
	//a的4个字节的空间,这里将a的4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个指针变量
	return 0;
}

存储地址连续的话只取第一个字节地址进行存储

指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
一个小的内存单元是1个字节
                               C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言
对于 32 位的机器,假设有 32 根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1 或者 0 );上图是32根地址线,可以产生2^32次方个编码,
内存的大小是可以设置的
如果每个编码指向一个字节的内存,2^32次方个字节,那么就会有4G的内存
32 位的机器上,地址是 32 0 或者 1 组成二进制序列,那地址就得用 4 个字节的空间来存储,所以
一个指针变量的大小就应该是 4 个字节。
那如果在 64 位机器上,如果有 64 个地址线,那一个指针变量的大小是 8 个字节,才能存放一个地
地址的大小是由地址线决定的,一根地址线一个bit位
总结:
1.内存被划分成一个个的内存单元,每个内存单元是一个字节
2.每个字节的内存单元都有一个编号,这个编号就是地址,地址在C语言中被称为指针
3.地址要存储的话,存放在指针变量中
4.每个内存单元都有一个唯一的地址来标识
5.在32位机器上地址的大小是4个字节,所以指针变量的大小也是4个字节,同理在64位机器上地址的大小是8个字节,所以指针变量的大小也是8个字节

指针和指针类型

C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言

 从上图可以看出&a的地址和a里面存储的样式,当我们使用*p进行修改值的时候就会有

C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言

 可以发现四个字节全部修改了,

如果我们换成 char* p来接受&a,再利用*p修改

C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言

C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言

就会发现只修改了一个字节,所以指针类型大小一样,但是解引用的进行操作时就会不一样,

1.即指针类型决定了解引用操作是操作几个字节 ,char* 操作一个字节,short* 操作两个字节

char* p还是int *p 存储同一个地址,里面的内容是不变的

C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言

如果地址加1 就会有不一样的效果,

C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言

2.指针类型的决定了地址加1 是跳过几个字节.比如 char* p   p+1跳过一个字节, int* 的指针加1跳过4个字节

野指针

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
#include <stdio.h>
int a;
int main()
{
	int* p = 0x11223344;
	*p;
	printf("%d", a);
	return 0;
}

存放的内容不是程序内的,

野指针成因
1.指针未初始化
在vs编译器如果指针变量未初始化,就会报错
#include <stdio.h>
int main()
{
	int* p;
	*p = 10;
	return 0;
}

C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言

 2. 指针越界访问

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
		*p = 1;
		p++;
	}
	return 0;
}

C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言

如果越界访问就会报错 ,当指针越界(超出数组arr的范围),p就是指针

3. 指针指向的空间释放
#include <stdio.h>
int* test()
{
	int a = 0;
	return &a;
}
int main()
{
	int* p = test();
	//p指向了被释放的地址,p就是野指针
	printf("%d", *p);
	return 0;
}

p指向了被释放的地址,p就是野指针

规避野指针
1. 指针初始化
如果不知道初始化什么值就初始化NULL
int* p = NULL

NULL是0

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

指针运算

#include <stdio.h>
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int* p = arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));//p指向的是数组首元素的地址
		// p+i 是数组中下标为i的元素的地址
	}
	return 0;
}

以上图为例

arr == p   可以推出 arr+i == p+i   也能推出 *(arr+i) == *(p+i) ==arr[i] ,更能写成*(i+arr) == i[arr],

指针+- 整数
#define SZ 5
#include <stdio.h>
int main()
{
	int arr[SZ];
	int* p = arr;
	for (p = arr; p < &arr[SZ];)
	{
		*p++ = 0;
	}
	return 0;
}

p < &arr[SZ]的原理为:

C语言第十三课--------初阶指针的认识--------重要部分,开发语言,c语言

 指针的关系运算

#define SZ 5
#include <stdio.h>
int main()
{
	int arr[10];
	int* p = NULL;
	for (p = &arr[SZ]; p > &arr[0];)
	{
		*--p = 0;
	}
	return 0;
}
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较。
简单的理解是数组元素地址只能和数组之后的的地址比较, 不能和之前的比较
指针-指针
#define SZ 5
#include <stdio.h>
int main()
{
	int arr[SZ];
	printf("%d", &arr[9] - &arr[0]);
	return 0;
}

指针-指针的前提:两个指针指向同一块区域,指针类型要相同

指针-指针差值的绝对值是指针和指针之间的元素个数

指针和数组

指针就是指针(指针变量),指针大小为4/8

数组就是数组,存放一组数据的,数组的大小取决于数组元素的个数和类型,

数组名是首元素的地址,但有两个例外:

1.sizeof 的数组名表示整个数组,计算的是整个数组的大小

2.&数组名,表示的是整个数组,取出的是数组的地址,数组的地址和数组首元素的地址,值是一样的,但是类型和意义不一样

二级指针

#include<stdio.h>
int main()
{
	int a = 9;
	int* p = &a;//p是指针变量,一级指针
	int** pp = &p;//pp是指针变量, 二级指针
	int*** ppp = &pp;//ppp是指针变量, 三级指针
	*ppp; //pp
	**ppp;//p
	***ppp;//a
	***ppp = 10;
	printf("%d", a);

	return 0;
}

二级指针简单理解就是用于存放一级指针地址的指针变量

指针数组

字符数组:存放字符的数组

整形数组:存放整形的数组

那么指针数组就是存放指针的数组

char * arr[] 存放字符指针的数组

short * arr[] 存放短整型指针的数组

int* arr[] 存放整形指针的数组

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[] = { 2,3,4,5,6,7,8 };
	int arr3[] = { 3,4,5,6,7,8,9 };
	int* arr[] = { arr1, arr2, arr3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}


	return 0;
}

总结:

初阶指针就介绍到这里了有不懂的小可爱可以私聊我文章来源地址https://www.toymoban.com/news/detail-645388.html

到了这里,关于C语言第十三课--------初阶指针的认识--------重要部分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 网络安全进阶学习第十三课——SQL注入Bypass姿势

    1、like,rlike语句,其中rlike是正则 2、大于号,小于号 3、符号:为不等于的意思相当于!= 4、采用regexp函数 5、in 6、between 1、 substring、substrB 2、 locate(str1,str2) 返回str1字符串在str2里第一次出现的位置,没有则返回0; locate(str1,str2, pos ) 返回str1字符串在str2里pos(起始位置)出现

    2024年02月13日
    浏览(46)
  • 【初阶C语言】认识和使用函数

    1. 函数是什么 2. 库函数 3. 自定义函数 4. 函数参数 5. 函数调用 6. 函数的嵌套调用和链式访问 7. 函数的声明和定义 8. 函数递归 在数学中有函数,在C语言中也有函数,我们直接先给出一个定义: 在基维百科中函数被定义为子程序:          在计算机科学中, 子程序 (英语

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

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

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

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

    2023年04月16日
    浏览(46)
  • 『初阶数据结构 • C语言』② - 算法为何重要

    本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。   算法这个词听起来很深奥,其实不然。它只是解决某个问题的一套流程。  准备一碗麦片的流程也可以说是一种算法,它包含以下 4步(对我来说

    2024年02月14日
    浏览(37)
  • 初阶C语言——指针

    Hello,我们又见面了,时间过的好快啊,转眼间也已经写了这么多份博客了,在接下来的一年里,小编也会认真学习的敲代码,我们一起进步,那今天开始讲我们的指针,指针这一章节在C语言的学习中是比较难的一章节,废话不多说,开始我们的学习吧。 1. 指针是什么? 指

    2024年02月13日
    浏览(40)
  • C语言——指针初阶

     哈喽,大家好,今天我们来学习C语言中的指针,今天主要学习初阶指针,后期我们将继续学习指针进阶。 目录 1. 指针是什么 2. 指针和指针类型 2.1 指针+-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4. 指针运算 4.1 指针+-整数 4.2 指针-指针 4.3 指针的关

    2024年02月05日
    浏览(76)
  • C语言指针(初阶)

    嘻嘻,家人们,今天咱们剖析一下指针,好啦,废话不多讲,开干! 假设有一栋宿舍楼,把uu们放在楼里面,楼上有100个房间,但是房间没有编号,此时如果uu们的朋友来找uu们玩的话,就得挨个房间去找,这样子的话,效率很低,但是如果我们根据每个楼层与楼层的放假情况,给每个房间进行编号

    2024年02月20日
    浏览(43)
  • 【C语言】初阶指针

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

    2024年02月12日
    浏览(33)
  • 初阶C语言-指针

    🌞 . ◡̈ ᴴᴬᵛᴱ ᴬ ᴳᴼᴼᴰ ᵀᴵᴹᴱ我们终会上岸,无论去到哪里都是阳光万里,鲜花灿烂 ₍ᐢ •⌄• ᐢ₎ 今天我们一起学习一下指针的相关内容吧! 📖指针是什么呢? 1.指针是内存中的一个最小单元的编号,也就是地址。 2.平时口语中说的指针就是指针变量,是用

    2024年02月12日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包