整理数据类型方面的一些问题。

苏嵌                                                                                                                              项目实战

学习日志                                     姓名:                      日期:

 

C语言数据类型方面的问题

 

今日学习任务

  1. 变量及其声明与定义
  2. 基本内置类型
  3. static、extern和const的用法
  4. auto、register和volatile的用法
  5. typedef详解
  6. 枚举、联合体

今日任务完成情况

基本完成

 

今日未解决问题

 

自我评价

其他

 

 

 

 

 

 

 

 

 

 

 

 

问题一:局部变量与全局变量区别?

        答:局部变量与全局变量的作用范围和内存空间的分配。局部变量只在本函数范围有效,在此函数以外是不能使用这些变量,即脱离了某一函数,该局部变量非法。全局变量的有效范围是从定义变量的位置开始到本源文件结束。局部变量内存空间是临时分配的,是程序运行到该函数时给该变量分配内存空间,函数结束则释放该内存空间;全局变量是程序运行时事先分配内存空间,当程序结束时释放内存。

 

问题二:局部变量若是和全局变量名重合会不会有问题?

        答:不会。局部变量名在自己的作用范围内最大,若是两者重名,则在局部变量的作用范围内全局变量将被屏蔽,不会起作用。

 

问题三:能不能在不同的函数中定义相同的变量名?

        答:能。在不同的函数中定义的多个相同变量名不会起冲突,原因就是各自的变量只在自己所在的函数中起作用,不会在其他的函数中起作用,相当于其他的函数看不见除本函数以外的变量,也就无谈影响了。

 

问题四:static全局变量与普通的全局变量有什么区别?

        答:两者的作用范围发生了变化。普通全局变量的作用范围是整个工程的所有源文件,而static全局变量作用范围则是本源文件,即只在自己所在的.C文件中有效。两者的存储方式没有不同,都是静态存储方式。

 

问题五:extern变量什么时候用?

        答:extern只有声明的作用。若是用extern声明一个变量,则这个变量一定在其他地方定义好了,不然在一个工程中会出现重复定义错误。比如:test_1.c源文件中定义了int a;在test_2.c源文件中也定义了int a;,两者在同一个工程中,编译时会弹出错误。这时候只要把两个源文件中任意一个int a声明为extern,即extern int a;,则编译不会出现错误。

 

 

问题六:const和其他数据类型组合起来怎么看出是修饰谁的?

        答:首先要注意的就是const int(char、long等) a和int(char、long等) const a两者的效果一样,const在前在后无所谓。当const和指针结合在一起后就要注意const是修饰的*a还是a。看个例子:const int *p,int * const p。这两个const分别修饰*p和p。方法:去掉数据类型,保留*和指针变量名。要是const *p形式,则是修饰*p整体,要是*const p形式,则是修饰p单个指针变量。

 

问题七:typedef struct与struct有什么区别?

        答:struct是结构体的关键字,用来声明结构体变量的。typedef struct是用来定义新的类型名来代替已有的类型名, 可将struct定义的结构体类型名重新改名。两者所代表的都是同样一个结构体,相当于同一个人的两个身份。

 

问题八:编译

typedef struct my_str

{

        char *p1;

        p_str p_next;

}p_str;出现错误怎么改?

        答:上述代码想要将struct my_str改名为p_str,这本身是没什么问题的,但问题是在结构体内部直接用了改变之后的结构体名。这里有一个问题就是,在编译的时候,系统还没见过p_str,所以到了p_str p_next;的时候,由于编译系统不认识新变量名导致错误。

        改正:

方法一:typedef struct my_str

{

        char *p1;

        struct my_str p_next;

}p_str;在结构体内部用结构体本名,而不用改了后的名字。

方法二:

typedef struct my_str p_str;

struct my_str

{

        char *p1;

        p_str p_next;

};先把结构体名字改了,虽然这个结构体还没有声明,但也是可以的。

 

问题九:typedef与#define区别?

        答:typedef是将一个类型改成另一个名字,后面跟变量不会有歧异。#defin本身是替换,后面跟变量有时会有歧异。

 

问题十:联合体和结构体的区别?

        答:联合体中定义的变量是共享一个内存的,而结构体则是每一个变量拥有各自内存。

你可能感兴趣的:(整理数据类型方面的一些问题。)