目录
14、已知一个数组table,用一个宏定义,求出数据的元素个数。
16、A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?
19、程序的局部变量存在于栈(stack)中,全局变量和静态变量存在于静态数据区 中,动态申请数据存在于堆( heap)中。
22、case 语句之后没有break,所以会执行完所有的条件。
1、*p++和++*p 的区别
表达式*p++表示先取出指针p指向的值,然后将指针p向后移动一个位置。即先取值后自增。
而表达式++*p表示先取出指针p指向的值,并将该值加1,然后将指针p指向加1后的位置。即先自增后取值。
#include <stdio.h>
#include<string.h>
int main()
{
int num[5]={10,20,30,40,50};
int *pnum = num;//数组名就是数组的首地址
for(int i=0;i<5;i++)
{
printf("%d\t",*pnum++); //*pnum++ 打印的结果
}
printf("\n");
int *pnum1 = num;
for(int i=0;i<5;i++)
{
printf("%d\t",++*pnum1); //++*pnum1 打印的结果
}
printf("\n");
}
运行结果:
2、关键字volatile有什么含意?
使用volatile修饰的变量,即该变量可能在程序运行过程中被意外修改。这意味着编译器不会对该变量进行优化,每次使用该变量都会去查询内存中的最新值,以确保程序的正确性。volatile关键字通常用于多线程编程中,用来确保多个线程对变量进行操作时的正确性。
3、const 有什么用途?
4、static有什么用途?
在函数内部使用static修饰局部变量时,表示该变量在程序的整个生命周期内只会被初始化一次,并且在函数调用结束后不会被销毁,其值会一直保持。这种特性使得静态局部变量成为一种很有用的工具,可以在多次函数调用之间保持其值。
在全局变量前使用static关键字修饰,表示该全局变量的作用域被限制在当前文件内,其他文件无法访问该变量。通过这种方式可以实现全局变量的封装,避免被其他文件不小心修改。
在函数前使用static修饰时,表示该函数的作用域也被限制在当前文件内,其他文件无法调用该函数。这种方式可以实现函数的封装和隐藏,只允许当前文件内部调用。
5、堆栈溢出一般是由什么原因导致的?
-
递归调用层次过深:当一个函数递归调用次数过多,堆栈中保存的函数调用信息会超出其分配的内存空间,导致堆栈溢出。
-
局部变量占用内存过多:当一个函数中定义的局部变量占用的内存空间过多时,会导致堆栈溢出。
-
循环调用:如果两个或多个函数相互调用,且调用次数过多,也可能导致堆栈溢出。
-
大规模数据结构:当需要在堆栈中存储大规模数据结构时,可能会超出堆栈的内存限制,导致堆栈溢出
6、如何引用一个已经定义过的全局变量?
7、队列和栈有什么区别?
8、Heap与stack的差别?
存储位置:
Stack:存储在程序的栈中,是一种先进后出的数据结构,使用栈指针来指向栈的顶部。
Heap:存储在程序的堆中,是一种动态分配内存的数据结构,使用指针来访问堆中的数据。
空间大小:
Stack:分配的空间大小固定,在程序编译时就确定了,通常比较小。
Heap:分配的空间大小不固定,可以根据需要动态分配或释放内存,通常比较大。
内存管理:
Stack:由编译器自动管理内存的分配和释放,遵循先进后出的原则。
Heap:需要程序员手动管理内存的分配和释放,容易产生内存泄漏或内存溢出的问题。
生存周期:
Stack:变量的生存周期与其所在函数的调用周期相同,当函数执行结束时,函数中的局部变量会自动被销毁。
Heap:变量的生存周期可以由程序员自行控制,需要手动释放内存,否则会导致内存泄漏
9、用宏定义写出swap( x,y),即交换两数
10、写一个“标准”宏,这个宏输入两个参数并返回较小的一个
11、写一个“标准”宏,这个宏输入两个参数并返回较大的一个
12、带参宏与带参函数的区别
13、关键字volatile有什么含意?
用于告诉编译器,该变量随时可能发生变化,不应该进行优化,而是应该时刻从内存中读取最新的值。这通常用于多线程并发编程中,可以防止编译器对变量进行优化,确保程序能够正确地访问共享的变量。volatile关键字可以保证变量的可见性和有序性。
14、已知一个数组table,用一个宏定义,求出数据的元素个数。
15、数组和链表的区别?
![](https://img-blog.csdnimg.cn/direct/4f6449a792114c2e9242745c0fb07adf.png)
16、A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?
17、static全局变量与普通的全局变量有什么区别?
-
作用域不同
- 普通全局变量的作用域是整个程序,即可以在程序的任何地方被访问。
- static 全局变量的作用域仅限于定义它的源文件。其他源文件无法直接访问该 static 全局变量。
-
链接属性不同
- 普通全局变量具有外部链接属性,可以被其他源文件通过 extern 关键字引用。
- static 全局变量具有内部链接属性,不能被其他源文件引用。
-
可见性不同
- 普通全局变量对整个程序可见。
- static 全局变量仅在其所在的源文件内可见。
18、static函数与普通函数有什么区别?
-
作用域不同
- 普通函数的作用域是整个程序,在程序的任何地方只要符合函数调用的规则都可以调用。
- static 函数的作用域仅限于定义它的源文件,其他源文件无法直接调用该 static 函数。
-
链接属性不同
- 普通函数具有外部链接属性,可以被其他源文件通过函数声明和调用。
- static 函数具有内部链接属性,不能被其他源文件访问和调用。
-
减少命名冲突
- 使用 static 函数可以减少函数名在多个源文件中的冲突可能性,因为它只在本文件内可见。
-
封装性
- static 函数有助于增强源文件内代码的封装性,使得一些只在本文件内使用的功能得以隐藏和隔离。
19、程序的局部变量存在于栈(stack)中,全局变量和静态变量存在于静态数据区 中,动态申请数据存在于堆( heap)中。
20、用两个栈实现一个队列的功能?要求给出算法和思路!
21、程序输出结果?
#include <stdio.h>
int sum(int a)
{
auto int c = 0;
static int b = 3;
c+=1;
b+=2;
return (a+b+c);
}
int main()
{
int i;
int a = 2;
for(i = 0;i<5;i++)
{
printf("%d,",sum(a));
}
}
输出结果: