C
A
#include<stdio.h>
int main()
{
//一维数组
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(a));//16
//1.数组名单独放在sizeof内部,数组名表示整个数组,所以sizeof(数组名)计算的是是数组总大小,单位是字节
//2.&数组名,数组名表示整个数组,所以&数组名取出的是整个数组的地址
//3.除此之外,所有的数组名都表示首元素的地址
printf("%d\n", sizeof(a + 0));//4 a代表首元素地址,a+i代表第i个元素的地址,在32位平台下所有的地址的大小都是4个字节
printf("%d\n", sizeof(*a));//4 a是首元素地址,*a是首元素--1,int型占4个字节大小
printf("%d\n", sizeof(a + 1));//4 a是首元素地址,a+1是第二个元素的地址,它还是一个地址
printf("%d\n", sizeof(a[1]));//4 a[1]--第二个元素
printf("%d\n", sizeof(&a));//4 &a虽然取出的是整个数组的地址,但它还是一个地址
printf("%d\n", sizeof(*&a));//16 &a取出的是整个数组的地址,对它进行解引用,就是这个数组,这个数字的大小就是16
printf("%d\n", sizeof(&a + 1));//4 &a取出的是整个数组的地址,加1跳过了整个数组(16个字节),但它还是一个地址
printf("%d\n", sizeof(&a[0]));//4 &a[0]取的是第一个元素的地址
printf("%d\n", sizeof(&a[0] + 1));//4 &a[0] + 1取的是第二个元素的地址
return 0;
}
B
系统指针长度为8
chp指向了b[0]
register关键字
1)register变量必须是能被CPU所接受的类型。
这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。
(2)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。
(3)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。
在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。
(4)局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;
(5)由于寄存器的数量有限(不同的cpu寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。
auto关键字
auto用于在函数中修饰变量为自动变量,且可省略。
所有局部变量默认都是auto,一般省略不写。
声明字符指针并赋值字符串:char *s1 = "abc"其实实际物理存储模式和字符数组是一样的,一个地址存一个字符,但是有两个和字符数组完全不同的地方。
1、赋值后不可修改数据
2、移动指针输出字符时,是从当前指针位置开始输出,到‘\0’停止
vc++2010 变量必须放在函数开头,(不支持C99的部分特性)
主键、外键、超键、候选键的区别
计算机二级中的9种运算问题:笛卡尔积,自然连接,交,并,选择,投影
(int)(-4.65)//-4
sizeof("ascdef")//7
strlen("ascdef")//6
整形常量为2个字节
实型常量为4个字节
&& 若左边为0则不会执行右边
转义字符 \ i (i不能大于127)
未赋初值的指针变量自动赋任意地址值
typedef int T[10]
T a[20];//int a[20][10]