1.用变量a 给出下面的定义:
e) 一个有10个指针的数组,该指针是指向一个整型数
的;
f) 一个指向有10个整型数数组的指针;
g) 一个指向函数的指针,该函数有一个整型参数并返
回一个整型数;
h) 一个有10个指针的数组,该指针指向一个函数,该
函数有一个整型参数并返回一个整型数
答案:
e)int * a[10];
f)int (*a)[10];
g)int (*a)(int);
h)int (*a[10])(int);
2.C语言编译后内存分为哪几部分?
- 栈(stack):由编译器进行管理,自动分配和释放,存放函数调用过程的各种参数,局部变量,返回值以及函数的返回地址。操作方式类似于数据中的栈。
- 堆(heap):用于程序动态申请分配和释放空间。C语言中的malloc和free,c++中的new和delete均是在堆中进行的。正常情况下,程序员申请的空间在使用和结束后应该释放,若程序员没有释放空间,则在程序结束后由系统自动回收。注意:这里的堆并不是数据结构中的堆。
- 全局(静态)存储区:分为DATA和BSS段,DATA段(全局初始化区)存放初始化的全局变量和静态变量;其中在BSS段(全局未初始化分区)存放存放未初始化的全局变量和静态变量。程序运行结束时自动释放,其中BSS段在程序执行之前会被系统自动清零,所以未初始化的全局变量和静态变量在程序执行之前已经是0。
- 文字常量区:存放常量字符串,程序结束后由系统释放。
- 程序代码区:存放程序二进制代码。
3.volatile关键字的作用是什么?
volatile可以告诉编译器,被修饰的变量随时可能发生变化,因此需要重新从内存或寄存器中读取或者修改。
volatile的基本应用场合:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义
4.const与define的区别?
const定义时,定义了常量的类型;#define 知识字符替换
#define是“编译时”的一个概念;const是一个“运行时”的概念,在程序运行时使用。
#define,不会分配内存,储存在程序代码段中;const需要进行内存分配,存储在程序的数据段中。
5.static关键字的作用
C语言中static关键字的常用于三种情况:修饰局部变量,修饰全局变量,修饰函数。
- static用于局部变量修饰符:被static修饰的局部变量只能在函数体内被调用。并且静态局部变量的值不会因为函数调用的结束而清除。当函数再次调用时,该变量的值是上次调用结束后的值。静态局部变量被存储在静态存储区(局部变量存放在栈中)。并且静态局部变量会被自动初始化为0。
- static用于全局变量修饰符:static修饰的全局变量成为静态全局变量。该变量只能在被当前文件的所有函数访问,不可以被其他文件内的函数访问。
- static用于函数修饰符:被static修饰的函数成为静态函数。同样静态函数只能在当前文件中被调用,不能被其他文件调用。
6. C语言的数据类型有哪些?
- 基本类型:包括整数类型和浮点类型,char属于整数类型。
- 派生类型:包括指针类型,数组类型,结构类型,共用体类型和函数类型。
- 枚举类型:枚举数据类型的作用是让数据更加简洁,易读。枚举数据的定义格式为:enum 枚举名 {元素1,元素2,...}; 枚举类型中的每一个元素都有其代表的值。未指定情况下,第一个枚举元素的默认值为0,后面每一个元素的值为前一个元素加。示例如下:
enum DAY{
MON, TUE, WED=5, THU, FRI, SAT, SUN
};
enum DAY day = MON, day1 = THU;
printf("%d\n", day); //day的输出是0
printf("%d\n", day1); //day1的输出是6
void类型:void类型指定没有可用类型的值。当函数不需要返回值时,必须使用void限定。例:void func(int a, char *b);当函数不允许接受参数时,必须使用void限定。例:int func(void);void用来定义指针时,该指针可以指向任意类型的数据。
7.什么是静态函数?它们有什么用?
答案:在C语言中,默认情况下函数是全局的。函数名称前的“ static”关键字使其变为静态。与C中的全局函数不同,对静态函数的访问仅限于声明它们的文件。因此,当我们想限制对函数的访问时,我们将它们设为静态。使函数成为静态的另一个原因可能是在其他文件中重用了相同的函数名。
8.long a=0x801010;
a+5=?
答案:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
printf("%ld\n",0x801010+5);
return 0;
}
//8392725
0x801010=8392720
9.
#include <assert.h>
#include <stdio.h>
int main()
{
int a;
char str[50];
printf("请输入一个整数值: ");
scanf("%d", &a);
assert(a >= 10);
printf("输入的整数是: %d\n", a);
printf("请输入字符串: ");
scanf("%s", str);
assert(str != NULL);
printf("输入的字符串是: %s\n", str);
return(0);
}
10.
#include <string.h>
#include <stdio.h>
int main()
{
char *str="hello world";;
char str1[50];
char str2[50];
strcpy(str1,str);
memcpy(str2,str+4*sizeof(char),3*sizeof(char));
str2[3]='\0';
printf("str1: %s\nstr2: %s\n", str1,str2);
return(0);
}
11.
常量不可被更改。
#include <string.h>
#include <stdio.h>
int main()
{
char *str="hello world";;
printf("%s\n",str);
str[0]='b';
printf("%s\n",str);
return(0);
}
/*报错
*hello world
*段错误 (核心已转储)
*/
12.
引用是一个更安全的指针;
引用必须被初始化;
有有空指针,没有空引用;
引用初始化完成之后不能被更改。
13
待续