short 2Byte
double 8Byte
float 4Byte
long 4Byte
sizeof(变量名或者变量类型); 计算字节长度
每一个字符在计算机中都用一个ASCII码值表示(最多有256个字符)内存中存放的是ASCII码值,显示时再进行转化
%c 字符 %d整形 %ffloat %lfdouble %x十六进制
int a = 1;初始化 a = 1;赋值
const 要进行初始化 不能再进行赋值
a++表达式值为原先的a值
关系表达式只有两个值(1或0)
描述一块内存 1,地址 2,大小
在语法层面上变量存数据,变量有地址 在计算机底层上内存存数据,内存有地址。
指针:指针变量 地址:
break:跳出此循环 continue:跳出本次循环,继续执行下一次循环操作
变量,内存,指针之间的关系
数组,指针,函数
内存图
变量本质:存储数据
数组下标从0开始
数组不初始化则数组的每个元素为随机数
取地址是用%p(可能是piont的意思) 输出8位16进制数(要看电脑的总线数)
数组的本质:内存 申请内存:内存本来就是有的,只不过是得到内存读写权限
申请内存是同时要进行初始化
数组在定义是可以不声明长度 但必须得赋初始值 int c[] =;则是错误的。
数组只有在定义的时候才能用大括号的方法,其他情况必须一个一个来访问。
当定义的数组长度小于可赋值的长度时编译可以通过,但是有潜在危险,这理论上是错误的,这就是数组越界
char a; a = 1;内存存的是数字1 a = '1';内存存的是ASIC码的1的值;
'\0'的ASIC码值为0
char a[]={'0','1'};不是字符串;
char a[3]={'0','1'};是字符串;
字符串以'\0'结尾的
字符串打印就是遇到'\0'时跳出循环;
指针变量加减法:type *p; p+i = p+i*sizeof(type);
求数组的地址打印出来就是数组的首地址;
地址的指针以字节为最小单位,不能单独打印具体的位的值;同时是直接与硬件关联的,并没有在内存中存储
不同类型的指针地址可以为不同类型的变量赋值,因为指针地址是没有类型可言的,但是不同类型的指针地址有不同的长度,写地址是没有错误,但是读地址有错误,要根据声明时的类型翻译成相应的类型,所以最好声明相同的指针地址。
即:从首地址访问sizeof()个字节,在将这些字节的二进制数据流按照所声明的类型进行解析。一共有两个步骤
NULL(注意大写) 为 0 指针变量可以赋值null
segmentation fault :访问内存错误;(内存越界,数组越界)
低地址位存低数据位称为小端。
验证: int a = 0x12345678;
int *p1 = &a;
char *p2 = &a;
for(i=0; i<4; i++)
{
printf("%x\n".*(p2+i));
}
强制类型转换是临时的只在当前语句有效,作用是为了消除警告
int 与 整数还是有区别的。
数组名代表数组首地址(int *p =a),或代表数组总大小(sizeof(a))
*(p+i) = p[i]=*(p++)=*(a+i); 一开始并没有声明p为数组,所以这就是数组的本质,一块连续的内存
但是*(a++)编译是不能通过的
所有的指针变量大小都为4个字节(32位系统而言) 声明指针变量的类型影响的是访问的字节数