1.原数组为a[2][2]={1,2,3,4,5}; a[0][2]=? 数组越界,但是二维数组的存储是连续的,范围的是下一行的值a[0][2]=a[1][0];
2.栈的存储遵循先进后出原则,所以下面的元素地址值比上面的地址值大;
3.char b="sdf";合法,但是char b; b="dff!";不合法.
char *p="dfads!";合法,但是*(p+1)='e';不合法,不能进行赋值修改变量的值
4.int64_t c; c占8字节
5.p=(&a+1)取地址加一加的是整个数组不是一个单元格; p[-2]=*(p-2)
int *p1=(int*)&a+1红色部分是一组逆运算,取地址解引用之后 int *p1=a+1=a[1];
int *p2=(int*)((int)a+1)红色区域将a强转成整型,加一表示加一个字节,注意大小端问题
6.++/--在遇到逗号、分号时认为本计算单元已经结束,会进行自加或自减。
7.static关键字的作用:static既可以修饰变量,也可以修饰函数,但两者的作用不一样,下面分别加以说明:
(1)static修饰变量
变量又分为全局变量和局部变量,被static修饰后的变量的内存在静态存储区,准确的说应该是 .data 段(《程序员自我修养》上有详细介绍)
a)静态全局变量
对于一般的全局变量,其生存周期和程序一样,作用域为整个文件,而且如果其他文件想引用该全局变量的话,可以使用extern关键字声明即可。但是当全局变量被static修饰以后,在原来基础上唯一改变的是,其他文件无法再通过extern进行引用。所以一般编程时都会加上static,这样就不用担心自己的变量和其他人定义的变量在命名上发生冲突了。
b)静态局部变量
静态局部变量的作用域和局部变量一样,只局限于某个函数内,其他函数无法引用。但也有其特殊的地方,一般的局部变量在函数调用完成以后会被系统自动释放,但是对于静态局部变量其生存周期和全局变量的周期一样;静态局部变量只初始化一次,下次调用时保持上一次的值而不会重复初始化。
(2)static修饰函数
static修饰函数时,函数的作用域仅局限于本文件(所以又称为内部函数)。使用内部函数的好处是不用担心自己写的函数和其他文件的函数重名。
8.关键字const
(1)const修饰变量(常变量)
const修饰变量时,变量变为只读变量。但竟然是变量,那就不能作为定义数组时的大小出现,因为数组的大小必须在编译时确定,必须为一个常量。
(2)const修饰指针
const int *p;
int const *p;
int *const p;
const int *const p;
这里提供一种简单的方法来判断const到底修饰的是p还是*p,总结起来就是一句话“忽略类型,直接右边”。我们判断const的修饰对象时可以忽略类型名,如上面的我们可以忽略int,则变成:
const *p;
const *p;
const p;
const *const p;