数组 2024.02.04

本文详细讲解了C语言中的数组指针、动态内存分配、内存泄漏、函数指针、回调函数、类型匹配以及数组排序等内容,强调了在编程实践中的关键概念和注意事项。
摘要由CSDN通过智能技术生成

数组指针

int main(void)
{
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    &a;
    return 0;
}

数组的指针,整个数组的首地址,a[10]  40个字节的首字节的地址

int main(void)
{
    int a[10] = {1,2,3,4,5,6,7,8,9,0}
    int *p;
    p = &a;     // ❌ 基类型不同   整型/一维整型数组
}



int (*p)[10];
p = &a;          //正确


printf("%p\n",p);
printf("%p\n",p + 1);    //二者差sizeof(基类型)  40个字节

a <=> &a[0]   //数组的首元素的地址

&a<=>           //数组的首字节的地址

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

int (*p)[4] = NULL;
p = a;
// *(p + 1) < = > p[1]  a[1]  int*

a[i][j] < = > *(*(a + i) + j)

int main(void)
{
    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    printf("%d\n",*((int*)(a + 3) - 3));
}

值为10

二维数组作为函数参数,形参为指向数组的指针

动态内存分配

如果用就开,用完了就销毁

指针函数 ,是函数,返回值是指针

int main(void)
{
    char *p = malloc(10);
    
    return 0;
}
int main(void)
{
    int n = 10,i;
    int *p = NULL;        //防止为野指针
    p = malloc(n * sizeof(int));
    if(p != NULL)
    {
        for(i = 0;i < n;++i)
        {
            p[i] = fib(i + i);
        }
        for(i = 0;i < n;++i)
        {
            printf("%d\n",p[i]);
        }
        free(p);             //销毁空间
        p = NULL;            //置空
    }
}

内存泄漏:malloc申请了空间,但是没有free销毁空间

扩容:malloc 一次申请空间一定是连续的,两次申请空间一定不是连续的

 

在使用返回值是指针的时候,需要注意的问题:

返回值是指针的函数不能返回局部变量的地址 (局部变量被销毁,成为野指针)

可以返回全局变量,static修饰的局部变量,自身传入的指针变量(实现对变量的间接访问)

函数指针

指针变量保存函数的入口地址

函数的函数名即为函数的入口地址

int add(int a,int b)
{
    return a + b;
}
int sub(int a,int b)
{
    return a - b;
}
void fn(void)
{
    
}

int main(void)
{
    int (*p)(int a,int b) = NULL;
    p = add;
    return 0;

}

指针变量p可以指向add sub

类型匹配  

设计函数指针的目的是降低程序的耦合性

运用:

回调函数 

int div3(int n)
{
	return n % 3 == 0 || n % 5 == 0;
}
void printArrary1(int *a,int len,int (*pfn)(int))
{
	int i;
	for(i = 0;i < len;++i)
	{
		if(pfn(a[i]) != 0)
		{
			printf("%d\n",a[i]);
		}
	}
}
int main(void)
{
	
	short a[] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int len = sizeof(a) / sizeof(*a);
	printArrary1(a,len,div3);
	return 0;
}

 比较大小


int shortcmp(const void *p1,const void *p2) 
{
	short *q1 = (short *)p1;
	short *q2 = (short *)p2;
	if(*q1 > *q2)
	{
		return 1;
	}
	else if(*q1 == *q2)
	{
		return 0;
	}
	else
	{
		return -1;
	}
}

int main(void)
{
	
	short a[] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int len = sizeof(a) / sizeof(*a);
	int i;
		qsort(a,len,sizeof(*a),shortcmp);
	for(i = 0;i < len;++i)
	{
		printf("%d\n",a[i]);
	}
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值