指针

  • 指针的概念
    • 1:对内存的理解
    • 2:地址
    • (重点)指针定义
  • 与指针有关的运用
    • 1:c语言动态内存管理
    • 2:内存泄漏?

指针的概念

1:对内存的理解

这是我们计算机的内存条。这当然是我们的物理内存

这是我们的虚拟内存

像我们可以写程序来操纵计算机内存这样子。
或者我们可以这样认为,物理内存是可以看得见,摸得着的,而虚拟内存反之。有关对虚拟内存的更深的认识点击这里虚拟内存

计算机所有的程序都需要内存来执行。

2:地址

在计算机中,内存是以字节为单位的存储空间,每个字节都有他自己的一个编号,这个编号就被称为内存地址。内存地址是存储数据的标志,可以理解为我们家的门牌号,通过门牌号可以找到里面的成员。内存数据所在内存中存储的位置就用内存地址来标识。

有关更深的理解点击这里 关于内存地址

我们在c语言中在定义一个变量时,系统就会为该变量分配内存空间,当我们赋值时,那么就相当于往杯子里装了水一样。
我们来看一个程序

我们来看一个运行结果

我们在定义num的时候,系统为它分配了空间,我们初始化,那么就是给杯子里装上了水。当然我们可以用键盘的输入----scanf()函数,
如下:

我们可以看到这个&号,叫做取地址符,我们要键盘输入赋值,首先要找到他的内存地址才可以,就好像送货上门,你得根据门牌号来送货。
如果我们在定义变量时未赋值,在控制台输出这个变量的值出现什么结果?


程序给了他一个33。当然在不同编辑器下的情况可能不同。像vc++会赋初值为0。
我们来看一个char类型的变量,遇到同样的情况,会是什么值?


codeBlocks给了一个空。
现在我们写一个程序,来访闻下相关变量的地址
我们这样写,并可能会发现一些有趣的

我们来看运行结果

我们可以看到他们的地,然后也会发现,在数组中取地址 ch 和&ch是等价的,我们还可以看到连续的数组里的地址,&char[0],&char[1]。非常有趣,更多的大家可以自己尝试。

(重点)指针定义

指针:指针我们可以理解为变量的地址,也就但同于变量的地址。
看一些资料容易混淆指针变量和和指针的区别,指针变量时存放地址的变量,而指针则等用于地址。有时候会把指针变量简称为指针,所以时常在碰上真正的概念区别时,反而晕了。

ok,我们用代码来证明

我们来看运行结果

我们可以看到,两者是等价的,撸一串代码对于概念的理解也很有帮助。

与指针有关的运用

1:c语言动态内存管理

指针的一个意义在于更方便的管理我们的内存空间。
我们来介绍几种函数。
1:void* malloc(size_t size)void*(无值型)所以这个是可以强制转换的,可以转换成需要的指针。
malloc函数用来开辟一段连续的内存空间,开辟成功返回值为这块内存空间的地址,开辟失败返回值为NULL,size为空间的大小,单位为字节。在用malloc开辟空间后要检查是否开辟内存成功,使用完这段内存后要用free(void* ptr)释放内存,否则会造成内存泄漏。
例如:

int *p1;
double *p2;
p1 = (int)*malloc(4);
p2 =(double*)malloc(8);

我们来看一个例子

如果没有看清图片,我们来看代码片

#include<stdio.h>
int main()
{int *ptr;ptr =(int*)malloc(sizeof(int));if(ptr==NULL){printf("分配内存空间失败");exit(1);//退出}printf("请输入一个整数 ");scanf("%d",ptr);printf("你输入的整数是: %d\n",*ptr);free(ptr);//释放掉指针return 0;
}

我们来看运行结果

这里我们注意一点,由于并不是所有的操作系统都是四个字节,所以我们要用到sizeof。

我们再来看一个程序,功能是根据用户输入整数的个数来申请空间。


我们来看代码片

include<stdio.h>
#include<stdlib.h>
int main()
{int *ptr=NULL;int num,i;printf("请输入整数的个数:");scanf("%d",&num);ptr =(int*)malloc(num*sizeof(int));for(i=0;i<num;i++){printf("请录入第%d个整数:",i+1);scanf("%d",&ptr[i]);}printf("您录入的整数是:");for(i=0;i<num;i++){printf("%d",ptr[i]);}free(ptr);return 0;}

ok,我们来看运行效果

2:void *memset(void *str, int c, size_t n)
memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的;

包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化;
我们来看具体代码运用

我们来看代码片
下面展示一些 内联代码片

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10
int main(){int *ptr =NULL;int i;ptr=(int *)malloc(N * sizeof(int));if(ptr ==NULL){printf("空间申请失败");exit(1);}memset(ptr,0,N*sizeof(int));for(i=0;i<N;i++){printf("%d",ptr[i]);}putchar('\n');free(ptr);return 0;}

我们来看运行结果
我们给了十个空间,都被程序给了0,因为我们没有赋值。

3:void *memcpy(void *dest, const void *src, size_t n)
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
就像这样,我们来简单看个代码片
下面展示一些 内联代码片

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void){int *ptr1 =NULL;int *ptr2 =NULL;ptr1 = (int*)malloc(10*sizeof(int));ptr2 =(int *)malloc(20*sizeof(int));//将ptr1的数据拷贝到ptr2中memcpy(ptr2,ptr1,10);free(ptr1);//我们将ptr1释放掉。return 0;
}

4:void* realloc(void* ptr,size_t size)
malloc或calloc开辟的空间进行扩容,ptr为malloc或calloc的起始地址,size为新开辟的空间的大小。
我们来看代码片
下面展示一些 内联代码片

#include<stdio.h>
#include<stdlib.h>
int main(){int i,num;int countq =0;int *ptr = NULL;//初始化NULLwhile(num!=-1){printf("请输入一个整数,输入-1表示结束:");scanf("%d",&num);countq++;ptr = (int*)realloc(ptr,countq*sizeof(int));if(ptr==NULL){printf("空间申请失败");exit(1);}ptr[countq-1] =num;}printf("输入的整数分别是:");for(i=0;i<countq;i++){printf("%d",ptr[i]);}putchar('\n');free(ptr);return 0;
}

我们来看运行结果

ok。
5:void* calloc(size_t num,size_t size)
calloc函数用来开辟num个size大小连续的内存空间,开辟成功返回值为这块内存空间的地址,开辟失败返回值为NULL。在用calloc开辟空间后要检查是否开辟内存成功,使用完这段内存后要用free(void* ptr)释放内存,否则会造成内存泄漏。
相关的操作大同小异,就不再赘述。

2:内存泄漏?

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

这这这。。。就关系到我们在空间管理上的合理运用。
关于内存泄漏的相关知识点请点击这里内存泄漏?
好啦,我们极端的举个例子
下面展示一些 内联代码片

#include<stdio.h>
#include<stdlib.h>
int main(void)
{while(1){malloc(1024);}getchar();return 0;}

代码短小精干,但原理涉及到计算机的内部。代码的长短决定不了代码的1功能和效果。

如果,没有管家的朋友们,可以试试运行这段代码。我的电脑管家会直接判断这是纳尼木马,连可执行文件都不让生成。
如果有兴趣的朋友,可以关掉杀毒,运行一下,你的电脑会假死后回来。

ok,关于指针的总结就到这里了,欢迎留言指点。
----jgdabc
相关的请遵守csdn协议。
更多博文点击这里jgdabc博文页面

c语言指针的有关总结相关推荐

  1. c语言获取指针分配的字节数,c语言指针知识点总结(共6篇).docx

    c语言指针知识点总结(共6篇) C语言指针教学中的知识点分析与总结 摘要:分析指针的基本概念及指针在数组.函数.字符串.动态存储分配等方面的应用,提出指针教学过程中易混淆概念及注意事项,对初学者深入理 ...

  2. C语言指针数组与数组指针的区别

    C语言指针数组与数组指针的区别 首先,顾名思义 数组指针是一个指针,是指向一个数组的指针,如 int (a*)[5]:这就是一个指向含有5个元素的数组的指针 指针数组是一个数组,它包含的元素全是指针变 ...

  3. simple c语言,C语言——指针(simple).ppt

    C语言--指针(simple) 莆田学院计算机教研室 2003年5月 指 针 绍兴文理学院自动化教研室 2011年4月 本讲主要内容 指针概述 地址· 指针· 指针变量 指针变量作为函数参数 指针与数 ...

  4. c语言115写成16进制,C语言指针问题

    C语言指针问题 來源:互聯網  2009-04-01 16:01:29  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: int a=115,*p;p ...

  5. C语言指针总结大学霸IT达人

    C语言指针总结大学霸IT达人 C语言的指针是C语言区别其它语言的最主要的特定之一.有了指针,C语言就可以抛开所有束缚,直接对内存中的数据进行操作,这样,不单对数据的操作更加快捷,并且可以高效的利用空间 ...

  6. CPU 以字节为单位编址,而 C 语言指针以指向的数据类型长度作自增和自减。

    切记:CPU 以字节为单位编址,而 C 语言指针以指向的数据类型长度作自增和自减.

  7. c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)

    C语言指针让一切想法变成可能,强转和指针可以看做一项呼风唤雨的利器,但是C语言中指针应用又需要格外的小心,其更灵活的利用内存,因为不当的应用可能引起各种异常,这篇文章就是让我们一起来认识C指针,更好的 ...

  8. c语言指针的相关运算,C语言指针的运算

    本文讨论使用指针进行的运算,最重要的运算是获取指针所引用的对象或函数.也可以比较指针,使用指针来遍历一个内存区域. 使用指针读取与修改对象 间接运算符 * 生成内存中的位置,该位置的地址存储在一个指针 ...

  9. C语言指针和二维数组

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, ...

  10. c语言首尾指针相同 则,6.C语言指针练习题.doc

    6.C语言指针练习题.doc 一.知识点 1.? 掌握指针.地址.指针类型.空指针(NULL)等概念: 2.? 掌握指针变量的定义和初始化.指针的间接访问.指针的加减运算.指针变量比较运算和指针表达式 ...

最新文章

  1. 3.3 栈的链式存储结构
  2. 演讲实录丨周斌:人工智能推动新基建和数据中心的技术革新
  3. TB6600原理图(最完整并量产过的版本!!)
  4. Cheat_Sheet ---Keras、Matlab、Matplotlib、Numpy、Pandas、Scikit-Learn、SciPy
  5. halcon 图像差分_Halcon编程-基于纹理的mara检测
  6. mybatis plus使用雪花算法_11.雪花算法与精度丢失
  7. 随想录(用好Visual Studio开发平台)
  8. 终面后拿offer几率_战绩 | 恭喜VIP学员斩获德勤(北京)风险分析师全职Offer!...
  9. Codeforces Round #574 (Div. 2)
  10. [转]Ribbon界面介绍(1)
  11. 【esp32-s3】6.1 文件系统——spi挂载tf卡
  12. stm32项目实战ST7735环境质量检测仪
  13. 防蓝光膜能减小手机对眼睛的伤害吗?
  14. 【MicroPython ESP32】I2C功能使用介绍
  15. 玫瑰线 matlab,如何用MATLAB画玫瑰线
  16. 第23天:如何使用带有哈利·波特PortKey的ARKit和Unity构建应用程序
  17. 加个ing是什么意思_恋爱ing什么意思(什么时候加ing)
  18. 小程序:Thu May 05 2022 11:03:00 GMT+0800 (中国标准时间) 渲染层错误
  19. Java性能优化怎么做好
  20. 要闻君说:国产5G 手机只比普通版手机贵500元?菜鸟物联网机器人分拨中心首落南京!亚马逊推出的AWS集中式备份服务来啦!...

热门文章

  1. Keil MDK软件仿真STM32F4出现access violation at 0x40023800: no read permisson
  2. 计算机模拟实验是科学实验嘛,科学实验室的四种类型
  3. Audio Unit: iOS中最底层最强大音频控制API
  4. 邮箱html开发注意事项
  5. 实验7 UDP与TCP对比
  6. 错误跟踪系统Sentry到底是何方神圣?
  7. 八个基本数据类型及长度
  8. Nlog详解---非常详细
  9. java基于Springboot+vue的房屋出租租房网站 elementui
  10. win7显示u盘efi分区_如何给U盘配置efi引导分区