C语言学习笔记—指针(四)函数指针、无类型指针、malloc、内存泄漏

news/2024/7/20 12:47:55 标签: 指针, c语言, 内存管理, 经验分享

在这里插入图片描述

函数指针

#include <stdio.h>
#include <stdlib.h>
void welcome()
{
	printf("Welcome !!!!!!\n");
}
int add(int a,int b)
 {
	return a+b;
 }
int main()
{
/*
	int a = 10;
    printf("a = %d\n",a);//通过变量名来访问变量
    
    int* p;//通过指针来访问变量
    p = &a;
    printf("a = %d\n",a);
    */
	 welcome();//通过函数名来调用函数
     //1.如何标识指针: *
     //2.如何知道是函数 ()
     //3.函数指针是专用的格式要求很强(参数类型,个数,返回值),就像数组指针一样

	//一、定义函数指针
     void (*p2)();
     
     //二、如何给函数指针赋值
     p2 = welcome;//函数名就是地址
     
     //三、如何通过函数指针调用函数
     p2();//方式1:直接通过指针名字+()
     (*p2)();//方式2:取内容(*指针名字)()
     
     //示例
     int (*padd)(int a,int b);
     int ret,ret2;
     //调用	
     padd = add;
     ret = padd(1,2);
     ret2 = (*padd)(1,2);
     printf("%d\n",ret);
     printf("%d\n",ret2);
	system("pause");
	return 0;
}

无类型指针&&malloc

首先说一个malloc函数
C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针
使用示例:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
   //int a[3];
    int i;
    int *a = (int *)malloc(3*sizeof(int));
    
for(i=0;i<3;i++)
{
	a[i] = i;
    
	printf("  %d   \n",a[i]);
}
 
   system("pause");
   return(0);
}

无类型并不是真的没有类型,而是不知道什么类型,malloc返回的类型是无类型的void,强转换成int *型,这样子才能定义一个int *型的指针,指向malloc开辟的地址。

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int n;
	printf("请输入元素总个数:\n");
	scanf("%d",&n);
	int *parry = (int *)malloc(n*sizeof(int));
	for(i=0;i<n;i++)
	{
		printf("请输入第%d个学生的成绩:\n",(i+1));
	    scanf("%d",&parry[i]);	
	}
	for(i=0;i<n;i++)
	{
		printf("第%d个学生的成绩为%d:\n",(i+1),parry[i]);
	}
		 
	system("pause");
	return 0;
}

内存泄漏

内存泄漏:
程序运行一段时间以后崩溃如

while(1) {
	sleep (1) ;
	int *p = malloc (1024);//malloc 申请的空间,程序不会主动释放
					//linux中的话,程序结束后,系统会回收这个空间。
	}

避免:
1.注意,循环中有没有一直申请空间
2.及时合理得释放 free§; p = NULL;

int *p;
int *p = NULL;
inta=0;
int sum = 0;

指针小检测

在这里插入图片描述

	int a;//1
	int *pa; //2
	int array[5]; //3
	int *p[4]; //指针 数组.4
	int (*p) [4]; //数组指针 p++.5
	int f();//6
	int* p();//7
//***************************
int *p(int *pa) {
	return pa ;
}
	main (){
	int a;
	int *p2 = NULL;
	p2 = p(&a);
	}
	//8
	int **p;
void *P;


http://www.niftyadmin.cn/n/775824.html

相关文章

C语言学习笔记—字符串

字符串定义方式及输出 #include <stdio.h> #include <stdlib.h> int main() {//字符串定义方式1int i;char str[5] {a,b,c,d,e};for(i0;i<sizeof(str)/sizeof(str[0]);i){printf("%c ",str[i]);}putchar(\n);//字符串定义方式2char str2[5] "…

C语言学习笔记—字符串操作常用的函数strcpy();\strncpy();\strcat();\strcmp();\strchr();\strstr();\strtok();\strlwr();

使用这些字符串函数时头文件要记得包含<string.h> puts&&gets puts的作用&#xff1a;将字符串输出到终端&#xff0c;puts函数一次只能输出一个字符串&#xff0c;字符串中可以包括转义字符。 gets的作用&#xff1a;gets从标准输入设备读字符串函数&#xff…

C语言学习笔记—结构体的定义和使用

结构体是一种构造类型数据&#xff0c;他与数组的区别是&#xff0c;数组中所有元素的数据类型是相同的&#xff0c;而结构体中的各个成员的数据类型可以不同。 可以看成结构体是由不同类型变量组成的一个集合。 结构体的定义 示例&#xff1a; struct Student//自定义类型 {…

C语言练习—使用结构体指针实现成绩计算操作

#include <stdio.h> #include <stdlib.h> struct Student {int score;char *name; };//分号//初始化 struct Student* initStu(int len) {int i;//struct Student stus[5];//struct Student *p stus;struct Student *p (struct Student *)malloc(len*sizeof(stru…

C语言练习—使用结构体数组实现成绩计算操作

#include <stdio.h> #include <stdlib.h> struct Student {int score;char *name; }; int main() {int i;struct Student Stus[3];struct Student maxScore;struct Student minScore;for(i0;i<3;i){printf("请输入第%d个学生的名字&#xff1a;\n",i1…

C语言学习笔记—结构体指针的定义和使用

#include <stdio.h> #include <stdlib.h> struct Student {int score;char name[128]; };//分号int main() {struct Student s1;s1.score 99;strcpy(s1.name,"张三");printf("%s:%d\n",s1.name,s1.score);//定义struct Student *p;//开辟空间…

C语言学习笔记—结构体大小如何计算

结构体大小计算需要满足的两条原则&#xff1a; 一、结构体成员的偏移量必须是成员大小的整数倍 二、结构体大小必须是所有成员大小的整数倍 #include <stdio.h> #include <stdlib.h>struct s1{ //一、结构体成员的偏移量必须是成员大小的整数倍&#xff08;0被认…

C语言学习笔记—type关键字

typedef为C语言的关键字&#xff0c;作用是为一种数据类型定义一个新名字。 这里的数据类型包括内部数据类型&#xff08;int,char等&#xff09;和自定义的数据类型&#xff08;struct等&#xff09;。 使用typedef定义新类型的方法&#xff1a;在传统的变量声明表达式里用 &a…