本文主要是介绍编导期末卷,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
编导期末复习
选择
++a 和 a++
n1 = a++; //a赋值后自增
n2 = ++a; //a先自增后赋值
运算符的优先级
第一 ++ -- !
第二 * / %
第三 + -
第四 = !=
第五 && || ?:(三目运算)
*地址
1.int a 表示一个内存空间,这个空间用来存放一个整数
2.int *a 表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间
3.int ** a 表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,指向这个空间的指针指向一个整数
4.int (*a)[4] 表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为4,类型为int的数组
和int* a的区别在于 ++ ,+=1之后的结果不同
5.int(*a)(int) 表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回值类型也是int
指针数组和数组指针
int * p[] 和 int(*p) []
int *P []是指针数组,全部元素为指针的数组
int(*q)[] q是一个指针,指向int[4]的数组
动态内存分配
1.静态开辟内存
例如
int a;
int a[10];
//栈就是指数据暂时存储的地方,所以才有进栈、出栈的说法。
静态开辟内存是固定大小,全局数组内存是在编译时分配好的,如果是局部变量数组,运行是在栈上静态分配的。
但无论是全局数组还是局部数组,都有一个固定的特点,就是他们大小是固定的,且是代码写死的。
如果想在运行时才定义一个数组的大小显然是不可能的。
比如:
int a;
cin>>a;
inta[a];
这样编译时会报错,编译器会提示[]中应为常量表达式
在c中有以下几种定义数组的方法
#define N 10
enum NUM{M = 10
};
int a1 [N];
int a2[10];
int a3[M];
!!!C中const int n =10 ; n并不能作为数组长度定义数组 , 但C++中则可以 .
2.动态开辟内存
在c中动态开辟空间需要用到三个函数:
malloc()
calloc()
realloc()
这三个都是向堆中申请的内存空间
在堆中申请的内存空间不会像在栈中储存的局部变量一样,函数调用完会自动释放。
需要我们手动释放,就需要free()函数来完成。
几个函数的特点如下
1.malloc()
void *malloc (size_t size)
1.malloc()函数会像堆中申请一片连续的可用空间
2,若申请成功,返回指向这片内存空间的指针,若失败,则会返回NULL,所以我们在用malloc()函数开辟动态内存之后,一定要判断函数返回值是否为NULL
3.返回值的类型为void型,malloc()函数并不知道连续开辟的size个字节是储存什么类型的数据,所以需要我们自行决定,方法是在malloc()前加强制转换,转化为我们需要的类型。如(int*)malloc(sizeof(int)*)
4.如果size为0,此行为是未定义的,会发生未知错误
实例如下
int *p = NULL;
int n = 0;
cin >> n;
p = (int*)malloc(sizeof(int) * n);
if(p != NULL){//....需要进行的操作
}
这样相当于创建了一个数组p[n],这个n值不用跟普通数组一样必须是变量,可以使运行程序时得出,或是用户输入的。
2.free()
void free(void* ptr)
在堆中申请的空间不会像我们在栈上储存的局部变量一样,函数调用完会自动释放内存,如果我们不手动释放,直到程序运行结束才会释放,这样会造成内存泄漏,即堆中这片内存中的数据已经不在使用,但它还一直占用这片空间,所以当我们申请的动态内存不在使用时,一定要及时释放
ps:free不能重复释放一块内存
free()的具体用法
int *p = NULL;
int n = 0;
cin >> n;
p = (int*)malloc(sizeof(int)*n);
if(p!=NULL){//需要执行的操做
}
free(p);
p = NULL;
3.calloc()
void * calloc(size_t num,size_t size)
和malloc()函数的区别在于,calloc()函数会在返回值之前将所有申请的内存空间中每个字节都初始化为0
1.calloc()函数功能是动态分配num个字节大小的size内存空间
2.若申请成功,返回值指向这片内存空间的指针,若失败,则会返回NULL,所以我们在用calloc()函数开辟动态内存之后,一定要判断函数返回值是否为NULL
3.返回值的类型为void型,callic()函数虽然分配num个size大小的内存空间,但还是不知道存储什么类型数据,所以需要我们自行决定,方法是在calloc()前加强制转化,转化成我们所需类
eg:(int*)calloc(num,sizeof(int))
4.如果size与num有一个或者都为0,此行为是未定义的,会发生未知错误
所以如果我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成这个需求。
4.realoc()
void * realloc(void * ptr,size_t size)
realloc()函数让动态内存管理更加灵活,在程序运行过程中分配内存大小,如果分配的太大,浪费空间,太小的话可能不够用,为了合理运用内存,我们一定会对内存的大小做灵活处理。那realloc()函数就可以做到对动态开辟内存大小的调整(可调大或者调小)
1.ptr为需要调整的内存地址
2.size为调整后需要的大小(字节数)
3.若调整成功,返回值为调整大小后内存的起始位置(也就是指向调整后内存的指针),若失败(当没有内存可以分配时,一般不会出现)则返回NULL,所以还是要对返回值判空
4.如果ptr是空指针,则和malloc()函数作用一样
注意 : realloc()函数在扩大内存空间时有两种情况
1).ptr所指的内存后有足够的内存空间用来扩展 ,如图 :
2).ptr所指内存后没有足够的空间来扩展 ,如图 :
当第二种情况时, 若申请新的内存空间成功, 会将ptr所指向的内存中的内容拷贝到新的内存空间中, ptr所指向的内存会被释放, 返回新得内存地址, 若不成功 ,ptr 所指内存不会被释放, 函数返回NULL
注意
1.malloc()和calloc()函数用法一样,唯一的区别是calloc()会对所申请的内存的每个字节初始化为零
2.malloc(),calloc(),realloc()申请的内容不在使用时,一定要用free()释放,否则会造成内存泄漏
3.p = realloc(ptr,size)函数的返回值不能为空时,释放内存时不需要写free(ptr),只需要写free(p)
判断
1.复合语句
复合语句包含封闭在大括号 ({ }) 中的零个或多个语句。可以在任何期望语句出现的位置使用复合语句。 复合语句通常称为“块”
eg:
if( Amount > 100 )
{cout << "Amount was too large to handle\n";Alert();
}
else
Balance -= Amount;
2.continue
当遇到 continue 时,出现在它之后的循环体中的所有语句都被忽略,循环准备下一次迭代。
int testVal = 0;
while (testVal < 10)
{testVal++;if (testVal) == 4continue; //终止循环的该次迭代cout << testVal << " ";
}
结果是
1 2 3 5 6 7 8 9 10
continue
当遇到 continue 时,出现在它之后的循环体中的所有语句都被忽略,循环准备下一次迭代。
int testVal = 0;
while (testVal < 10)
{testVal++;if (testVal) == 4continue; //终止循环的该次迭代cout << testVal << " ";
}
结果是
1 2 3 5 6 7 8 9 10
这篇关于编导期末卷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!