哪家能建设网站,企业服务账号是什么,天工网工程信息网官网,商标注册费用内存和地址
程序视角看内存是一个大的字节数组#xff0c;每个字节包含8个位#xff0c;可以存储无符号值0至255,或有符号值-128至127。 多个字节可以合成一个字#xff0c;许多机器以字为单位存储整数#xff0c;每个字一般由2个或4个字节组成。 由于它们包含了更多的位每个字节包含8个位可以存储无符号值0至255,或有符号值-128至127。 多个字节可以合成一个字许多机器以字为单位存储整数每个字一般由2个或4个字节组成。 由于它们包含了更多的位每个字可以容纳的无符号整数的范围是从0至4294967295(2^32-1)。尽管一个字包含了4个字节它仍然只有一个地址。
它的地址是最左边字节或者最右边字节的位置不同的机器有不同的规定。另一个需要注意的是边界对齐(alignment)。要求边界对齐的机器上整型值存储的起始位置只能是特定的字节通常是2或4的倍数。
内存中的每个位置由一个独一无二的地址标识。
内存中的每个位置都包含一个值。 如果知道一个值的存储地址可以根据地址取得这个值。但是地址不好记所以可以通过变量名访问地址的值。 名字与内存位置之间的关联并不是硬件所提供的是由编译器实现的。
int a 112,b -1;
float C 3.14;
int *d a;
float *e C;
值和类型
c声明为浮点数但是存放在内存中使用的整数它们可以被解释为整数也可以被解释为浮点数取决于它们被使用的方式。如果使用的是整型算术指令这个值就被解释为整数如果使用的是浮点型指令就是浮点数。
不能检查一个值的位来判断类型。为了判断值的类型,必须观察程序中这个值的使用方式。
指针变量的内容
指针变量存放指针指向变量的地址。
d和e的内容是地址而不是整型或浮点型数值。d的内容与a的存储地址一致而e的内容与c的存储地址一致
间接访问操作符
通过一个指针访问指向的地址的值间接访问或解引用指针间接访问的操作符*。
*d112
*e3.14 *a 25;
把值25赋值给变量 a。
产生变量 a的地址它是一个指针常量。*操作符访问其操作数所表示的地址。表达式中操作数是a的地址所以值25就存储于 a中。
*(int *)100 25
强制类型转换把值100从“整型”转换为“指向整型的指针,对它进行间接访问。如果 a存储于位置100,那么这条语句就把值25存储于a。
需要通过地址访问内存中某个特定的位置它并不是用于访问某个变量而是访问硬件本身。
未初始化和非法的指针
下面的指针a没有初始化就进行赋值是非法的。a存放的是一个随机的整数行为未定义。
int*a;
*a 12;
NULL指针
NULL指针是一个特殊的指针变量表示不指向任何东西。要使一个指针变量为NULL可以给它赋一个零值。为了测试一个指针变量是否为NULL,你可以将它与零值进行比较(源代码约定)。
NULL指针并未指向任何东西因此对NULL指针进行解引用操作是非法的。在对指针进行解引用操作之前首先必须确保它并非NULL指针。
指针的指针
int a12int *baint **cb
c的类型是一个指针b是指向整型的指针c是一个指向整型指针的指针。
指针表达式
char ch ’a’char *cpch ?为ch后面的内存位置(方便后续使用)。
ch
作为右值使用表示表达式的值为a 作为左值使用表示内存的地址而不是该地址所包含的值。 ch
作为右值表示变量ch的地址这个值等于变量cp存储的值。
只能作为右值不能作为左值。 cp右值是cp的值(存放ch的地址)左值是cp所处的位置(左值一般是等号左面用作赋值)。 cp右值表示取指针变量的地址指向字符指针的指针。左值非法。 *cp右值表示间接访问ch‘a’。左值表示ch的地址 *cp1
右值*优先级高于所以执行间接访问操作得到值‘a’1后得到’b’。
左值非法 *(cp1)
右值表示的值。左值表示的地址 cp
右值表达式的结果是增值后的指针的一份拷贝。执行后cp指向
左值非法 cp
右值增加cp的值执行后cp指向。但先返回cp值的一份拷贝再增加cp的值。表达式的值式cp原来值的一份拷贝。左值非法。 *cp
右值间接访问操作符作用再增值后的指针的拷贝上表示的值。
左值表示内存地址。 *cp
右值和左值分别是变量ch的值和ch的内存位置。cp指向
后缀操作符的优先级高于*操作符。 (1)操作符产生cp的一份拷贝.
(2)操作符增加 cp的值.
(3)在cp的拷贝上执行间接访问操作. *cp
右值表示ch变为b左值非法 (*cp)
与12类似结果是ch增值前的值(‘a’),但是ch的值变为’b’。 *cp *cp,需要做的只是增加它的结果值。
指针运算
当一个指针和一个整数量执行算术运算时整数在执行加法运算前始终会根据合适的大小进行调整。合适的大小就是指针所指向类型的大小调整就是把整数值和合适的大小相乘。 算术运算
1指针士 整数
指向数组中某个元素的指针
#define N_VALUES 5
float values[N_VALUES];
float *vp;
for( vp values[0]; vp values[N_VALUES];)
*vp 0;
for语句的初始部分把 vp指向数组的第1个元素。 经过第1次循环之后 经过5次循环之后vp就指向数组最后一个元素后面的那个内存位置。 2指针 一 指针 只有当两个指针都指向同一个数组中的元素时才允许从一个指针减去另一个指针两个指针相减的结果的类型是 ptrdiff_t,它是一种有符号整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。
关系运算
指针都指向同一个数组中的元素可以进行关系运算判断哪个指针在数组的前面或后面。