公司网站建设论文,自己设计图片的软件,电子商城网站建设 模板,查学校去哪个网站目录
一、前言
二、指针是什么
小结#xff1a;
三、指针变量是什么
小结#xff1a;
四、指针在32位机器和64位机器中的差别
32位机器#xff1a;
64位机器:
小结#xff1a;
五、指针和指针类型
#xff08;1#xff09;指针的意义
#xff08;2#xff…目录
一、前言
二、指针是什么
小结
三、指针变量是什么
小结
四、指针在32位机器和64位机器中的差别
32位机器
64位机器:
小结
五、指针和指针类型
1指针的意义
2指针的解引用
六、野指针
1野指针的概念
2野指针的成因
3如何规避野指针
4个人对野指针的一点小分享
七、指针的运算
1指针加减整数
2指针减指针
3指针的关系运算
八、指针和数组
1指针和数组的表达
小结
2二级指针
3指针数组 一、前言 刚入门C语言的小白或多或少被指针这块内容折磨过我自己在学校听老师讲课也是一脸模糊的样子。
不过我那时候不断提醒自己这块内容这块内容对于初学者来说是会有点难度我现在刚开始接触自然会很难但重要的是要坚持下去并愿意从差开始。
而经过了一个寒假的学习我对指针这块内容有了比较深的理解看完这篇博客保证你对指针的理解会更深一步 二、指针是什么 在学习指针之前我们先要正确认识指针
关于指针有2个要点1. 指针是内存中一个最小单元的编号也就是地址2. 平时口语中说的指针通常指的是指针变量是用来存放内存地址的变量
小结
指针就是地址口语中说的指针通常指的是指针变量 三、指针变量是什么 通过取地址操作符取出变量的内存其实地址把地址可以存放到一个变量中这个 变量就是指针变量
#include stdio.h
int main()
{int a 10;//在内存中开辟一块空间int *p a;//这里我们对变量a取出它的地址可以使用操作符。//a变量占用4个字节的空间这里是将a的4个字节的第一个字节的地址存放在p变量中p就是一个之指针变量。return 0;}
小结
总结 指针变量用来存放地址的变量。存放在指针中的值都被当成地址处理 四、指针在32位机器和64位机器中的差别 32位机器
对于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/1024MB2^32/1024/1024/1024GB 4GB
即在32位机器中有4G的空间进行编址
64位机器: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 ... 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 通过计算我们可以得出在64位机器中
2^64Byte (2^32Byte)^2 (4G)^2 16G
也就是说在64位机器中有16G的空间进行编址 综上我们可以得出
●在32位的机器上地址是32个0或者1组成二进制序列地址就得用4个字节的空间来存储所以一个指针变量的大小就应该是4个字节。●在64位机器上有64个地址线那一个指针变量的大小是8个字节才能存放一个地址。
说到这里小蔡要提醒各位关于在不同位数的机器中指针的大小非常重要请各位铭记于心 小结
●指针变量是用来存放地址的地址是唯一标示一个内存单元的●指针的大小在32位平台是4个字节在64位平台是8个字节 五、指针和指针类型 我们都知道变量有不同的类型整形浮点型等。那指针有没有类型呢 准确的说有的。
我在这里例举一些常见的指针类型
char *pc NULL;
int *pi NULL;
short *ps NULL;
long *pl NULL;
float *pf NULL;
double *pd NULL;
这里可以看到指针的定义方式是 类型 * 其实 char* 类型的指针是为了存放 char 类型变量的地址。 short* 类型的指针是为了存放 short 类型变量的地址。 int* 类型的指针是为了存放 int 类型变量的地址。 1指针的意义 关于指针的用法主要是“ 指针加减整数 ”的相关知识
首先我们来讲一讲“” 指针加整数 代表着什么来看看这个代码
#include stdio.h
//演示实例
int main()
{int n 10;char *pc (char*)n;int *pi n;printf(%p\n, n);printf(%p\n, pc);printf(%p\n, pc1);printf(%p\n, pi);printf(%p\n, pi1);return 0;
}
运行结果及差别如下 可以看出char* 类型进行1操作时前后地址相差为 1
而 int* 类型进行1操作后前后地址相差为4
由此我们可以得出
指针的类型决定了指针向前或者向后-走一步有多大距离 2指针的解引用 先看下面代码
//演示实例
#include stdio.h
int main()
{int n 0x11223344;char *pc (char *)n;int *pi n;*pc 0; //重点在调试的过程中观察内存的变化。*pi 0; //重点在调试的过程中观察内存的变化。
return 0;
}
我们来看看调试过程中 *pc 和 *pi 有什么不同之处 由此我们可以得出下面的结论
指针的类型决定了对指针解引用的时候有多大的权限能操作几个字节比如 char* 的指针解引用就只能访问一个字节而 int* 的指针的解引用就能访问四个字节 六、野指针 在刚开始接触编程的时候我就有对 野指针 所耳闻下面来具体讲讲野指针 1野指针的概念 概念 野指针就是指针指向的位置是不可知的随机的、不正确的、没有明确限制的 2野指针的成因 1. 指针未初始化
#include stdio.h
int main()
{int *p;//局部变量指针未初始化默认为随机值*p 20;return 0;
}
2. 指针越界访问
#include stdio.h
int main()
{int arr[10] {0};int *p arr;int i 0;for(i0; i11; i){//当指针指向的范围超出数组arr的范围时p就是野指针*(p) i;}return 0;
}
3. 指针指向的空间释放 这一点涉及较为后面的内容对于C语言小白可以等到后续学习到动态内存的时候在进行学习 3如何规避野指针 1. 指针初始化 2. 小心指针越界 3. 指针指向空间释放及时置NULL
定义指针可以这样子写来防止出现野指针int * p NULL 4. 避免返回局部变量的地址 5. 指针使用之前检查有效性 4个人对野指针的一点小分享 我们可以把野指针看成一只野 D o g不把他拴住他就会乱啃乱咬但我们只要把他拴住它就不能为非作歹了。
拴住就是类似这样子int * p NULL 七、指针的运算 指针的运算这部分主要讲解这几点
●指针加减 整数●指针减指针●指针的关系运算 1指针加减整数 这一块内容前面已有讲解这里不再赘述。
总结起来就是指针加减整数就是表示指针向前-或向后的意思 2指针减指针 这里可以用一个和strlen函数有相同功能的函数来理解 指针减指针 的意义
int my_strlen(char *s)
{char *p s;while(*p ! \0 )p;return p-s;
}
这串代码的意思就是传一个数组首元素地址给 my_strlen 函数
然后创建一个 char* 类型的变量p先把首元素地址赋给 *p
然后开始循环只要*p不等于\0p就会进行1操作。
这样下去知道遇见\0也代表着数组的结束这时候就返回 p-s 指针减指针的值。
而这里的指针减指针的值代表的意思就是p到s之间的元素个数所以可以用来实现求字符串长度的功能 3指针的关系运算 这部分内容有涉及到的请况比较少大家只要记住下面这一点就可以了
在C语言的标准中规定允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。 八、指针和数组 指针和数组的一起用的场景非常之多下面来讲一讲指针和数组之间的各种关系 1指针和数组的表达 我们先看一个例子
#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;
}
运行结果 可见数组名和数组首元素的地址是一样的。 小结
数组名表示的是数组首元素的地址。2种情况除外一种是arr,取出的是整个数组的地址另一种是sizeofarr计算的是整个数组的大小 那么这样写代码是可行的
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]);for(i0; isz; i){printf(arr[%d] %p p%d %p\n, i, arr[i], i, pi);}return 0;
}
运行结果 所以 pi 其实计算的是数组 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; isz; i){printf(%d , *(p i));}return 0;
} 2二级指针 用大白话来讲二级指针就是存放指针变量的地址。
下面请看我花的思路图 对于二级指针的运算有
● *ppa 通过对ppa中的地址进行解引用这样找到的是 pa *ppa 其实访问的就是 pa .
● **ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作 *pa 那找到的是 a . 3指针数组 这是这篇博客的最后一个内容啦主要讲解指针数组的相关知识
先问大家一个问题指针数组是指针还是数组 答案是数组。是存放指针的数组。 数组我们已经知道有整形数组字符数组。 而指针数组是怎么样的呢
请看下面的图 总的来说指针数组是数组——装着指针的数组这点内容只要理解它是什么并且会用就好啦 以上就是本篇博客的全部内容啦如有不足之处还请各位指出期待能和各位一起进步