1.const 的全面理解:
(1)说说你对const 的理解(主要C语言范围内)
const是一个C中类型修饰符;
常见的类型修饰符有:short,long,unsigned,signed,static,auto,extern,register,volatile;
定义一个变量:类型描述符 变量名;
类型描述符包括:类型的修饰符以及数据类型 int char float ......
1)类型描述符中如果有多个关键字,它们出现的位置不影响他对变量的限制:
short int i;
int short i;
static int short i;
int static short i;
(2)下面的声明都是什么意思?
const int a
int const a
以上完全一样,描述的都是一个const的整型变量。
const int *a
int* const a
int const* const a
对指针变量类型的理解:
1). [] () * 在数据定义时与在表达式中优先级一样的理解。例如:
int *a[10] //因为 [] 的优先级 高于* ,因此是一个数组,每个成员类型为指针,指向int
int (*a)[10] //因为()的优先级高于[] ,因此,先看里面,是一个指针,指向的类型为一个数组
2). 指针的判断从右向左:
const int *a //a是变量名,*表示它是一个指针(类型已经确定),余下的是指向的类型;
//因此,a是一个指向const int 的指针,即指向的数据不可修改;
int* const a // *const一起来修饰a,即a只读,*表示a是一个指针,因此,这是一个只读指针,指向的类型为int型 // 的变量
int const *const a // *表示指针,因此指针不可修改,int const是指针指向的类型,仍然是const;
(3)
typedef void* VP;
(a)const void *ptr存储位置;
(b)const VP ptr存储位置;
首先要理解typedef是定义一种数据类型,一定要与define区分开;
typedef void* VP; // VP是名字,余下的是这个类型的真实类型
const VP ptr; // 是不是替换为const void *ptr;??不是,void*是一个整体
// const int i; == int const i;
// VP const ptr; 即 void *const ptr;
(4)为什么还在编程中全用const?
1).向其他程序员传递一个信息。这个不要修改。
2).有可能让编译器产生更精简紧凑代码,减少bug。
3).合理的保护我们只读的数据,避免不必要的错误。
使用位置:
1)定义常量,防止被修改;
2)函数的参数中,如果不期望子函数去修改被调用函数的某个数据,可以加以限制。例如:
char *strcpy(char *dest , const char *src);
char *strcpy(char *dest,const char *src,size_tn);
3) 在C++中,类的成员函数的使用。
2. sizeof 是函数吗?准确的列出sizeof() 的功能。以下代码中(32位平台):
int a[10];
int *ptr;
以下内容作为右值时,是否正确,如果正确,值为多少?
sizeof(a)
sizeof(a[10])
sizeof(a[1])
sizeof(ptr)
sizeof(*ptr)
sizeof(int)*ptr
(1)谈谈你对sizeof 的理解。
sizeof不是函数,C语言的一个关键字,作为右值时,求某个数据类型(sizeof(int))或某个变量对应的数据类型sizeof(a)来定义某个变量时,在当前平台下所需要占用内存空间的大小。并不是真正求某个变量本身的内存空间大小,也不会涉及到对这个空间的访问。
sizeof(a) // 找到a的类型,int[10]是a 的类型,因此是一个数组,相当于sizeof(int[10]),值40(32位平台)
sizeof(a[10]) // a[10]本身是一个越界访问,但是,这里并不是去访问a[10]的空间大小,而是求它的类型
// a[10] ----> *(a+10) 即a指向的类型,即int型,因此,求的是sizeof(int)即4个字节。
sizeof(a[1]) // 同上,4字节。
sizeof(ptr) // 指针本身类型占用空间大小,32位平台4个字节。
sizeof(*ptr) // ptr指向的数据类型,因此为int型,4个字节。
sizeof(int)*ptr // 编译出错的。sizeof(int), *ptr取内容, 中间没有运算符。
3.static 的理解