vlambda博客
学习文章列表

c语言指针的有关总结

指针

  • 指针的概念


    • 1:对内存的理解

    • (重点)指针定义

  • 与指针有关的运用


    • 1:c语言动态内存管理

    • 2:内存泄漏?


指针的概念

1:对内存的理解

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

这是我们的虚拟内存
c语言指针的有关总结
像我们可以写程序来操纵计算机内存这样子。
或者我们可以这样认为,物理内存是可以看得见,摸得着的,而虚拟内存反之。

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

2:地址

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

(重点)指针定义

ok,我们用代码来证明
c语言指针的有关总结
我们来看运行结果
c语言指针的有关总结

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

与指针有关的运用

1:c语言动态内存管理

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

  • 2

  • 3

  • 4

我们来看一个例子
c语言指针的有关总结
如果没有看清图片,我们来看代码片

#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;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

我们来看运行结果
c语言指针的有关总结
这里我们注意一点,由于并不是所有的操作系统都是四个字节,所以我们要用到sizeof。

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

c语言指针的有关总结
我们来看代码片

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;


}

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

ok,我们来看运行效果
c语言指针的有关总结
2:void *memset(void *str, int c, size_t n)
memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的;

包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化;
我们来看具体代码运用
c语言指针的有关总结
我们来看代码片
下面展示一些 内联代码片

#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;

}

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

#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;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

#include<stdio.h>
#include<stdlib.h>
int main(){
int i,num;
int countq =0;
int *ptr = NULL;//初始化NULL
while(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;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

2:内存泄漏?

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

这这这。。。就关系到我们在空间管理上的合理运用。

好啦,我们极端的举个例子
下面展示一些 内联代码片

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

}
getchar();
return 0;


}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

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

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