指针相关知识及函数测试总结

知识更新及回顾

万能指针void*(也称空类型指针)

        void*指针可以指向任何变量的内存空间

#include <stdio.h>

int main()
{
	int a=100;
    int *p=&a;	//正常方式
    void *p2=NULL;	//定义万能指针  万能指针可以接收任意类型变量的地址
    p2=&a;
    printf("void 类型指针pa指向的内容是:%d\n", *(int *)p2);
    //通过万能指针修改变量内容值,需要指定变量对应的指针类型
    *(int *)p2=300;
    printf("void 类型指针pa指向的内容是:%d\n", *(int *)p2);
	
	return 0;
}

动态内存申请

1.动态分配的概述

数组定义时,数组长度是预先定义好的,整个程序中固定不变。但实际编程中,往往需要根据实际情况申请空间。

C语言提供了一些内存管理函数,可以通过需要动态分配内存空间,也可以把不再使用的空间回收。

2.静态分配、动态分配

2.1静态分配

2.1.1在编译或运行时,按事先规定的大小分配空间,比如int a[10]

2.1.2必须事先指定所需空间大小

2.1.3分配在栈区或全局变量区,一般以数组形式

2.1.4按计划分配

⒉.2动态分配

2.2.1在程序运行中,根据需要大小自由分配

2.2.2分配在堆区,一般使用特定函数进行分配

2.2.3按需分配

3.动态分配函数

mallogc函数

free函数

calloc函数

recalloc图数

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int *arr;
	arr=malloc(sizeof(int)*20);		
	int i;
	for(i=0;i<20;i++){		//初始化 
		*(arr+i)=i+20;
	}
	for(i=0;i<20;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
	for(i=0;i<20;i++){
		printf("%#p \n",(arr+i));
	}
	*(arr+4)=500;		//改变i中一个值 
	for(i=0;i<20;i++){
		printf("%d ",*(arr+i));
	}
	printf("%#p ",arr);
	free(arr);		//释放内存空间 
	printf("\n");
	for(i=0;i<20;i++){
		printf("%d ",*(arr+i));
	}
	printf("%#p ",arr);
    arr=NULL;
	
	return 0;
}

 结束后指针指空

只读指针变量和只读变量指针

只读指针变量

int  * const arr;
int a;
//arr=a;    //直接报错不能更改指针
arr=100;    //可以更改值

const 先结合左边的,就是对指针进行了固定,不能更改

只读变量指针

int  const * arr;
int a;
arr=a;    //可以更改值
//arr=100;    //直接报错不能更改指针

测试总结:

选择题:

3.若调用一个整型函数,且此函数中没有return语句,则正确的说法是(D)

A、该函数没有返回值        B、该函数返回若干个系统默认值

C、能返回一个用户所希望的函数值        D、返回一个不确定的值

(调用的是整型函数,它是有返回值的,但由于没有return,因此它返回一个不确定的值)

18.一个函数的返回值由(D)确定。

A、return语句中的表达式        B、调用函数的类型

C、系统默认的类型        D、被调用函数的类型

编程题:十进制转换为2进制(对负数运用了先取绝对值,再减一,再取反,且取绝对值时应用fabsl(),fabs()不够范围 )

#include <stdio.h>
#include <math.h>
/*十进制转换为2进制*/
void er(long long num);

int main()
{
	signed long long int num;
	printf("十进制转换为二进制\n请输入这个十进制(正/负数都行):"); 
	scanf("%lld",&num);
	er(num);
	return 0;
}

void er(long long num)
{
	int arr[64]={0};
	int i;
	if(num<0){
		num=fabsl(num);
		num-=1;
		for(i=0;i<63;i++){
		arr[64-1-i]=num%2;
		num/=2;
		}
		for(i=0;i<64;i++){
			if(1==arr[i])
				arr[i]=0;
			else
				arr[i]=1;
		}
		for(i=0;i<64;i++)
		printf("%d",arr[i]);	
	}
	else{
	for(i=0;i<64;i++){
		arr[64-1-i]=num%2;
		num/=2;
	}
	for(i=0;i<64;i++)
		printf("%d",arr[i]);
	}
}
	

结果为:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值