知识更新及回顾
万能指针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]);
}
}
结果为: