免费网站后台模版,插画原画十大培训机构,wordpress注册目录,知名餐饮设计公司参考#xff1a; 里科《C和指针》 指针存储的是一个地址#xff0c;实际就是一个值。
如果像下面一样对未初始化的指针进行赋值#xff0c;如果a的初始值是非法地址#xff0c;那么会报错。UNIX会提示段错误segmentation violation#xff0c;或内存错误memory fault 里科《C和指针》 指针存储的是一个地址实际就是一个值。
如果像下面一样对未初始化的指针进行赋值如果a的初始值是非法地址那么会报错。UNIX会提示段错误segmentation violation或内存错误memory fault指程序试图访问一个未分配给程序的内存位置如果windows的话一般是保护性异常General Protection Exception。如果a的初始值是合法地址那可能更麻烦了因此在对指针进行间接访问之前必须确保已经初始化或者是NULL。
int *a;
...
*a 12;向函数传递指针前也要先检查是否为NULL。因为按标准在函数里不检查检查交给用户创建时检查。
指针的指针
int a 12;
int *b a;
int **c b;char ch a;
char *cp ch;表达式值说明重要性*cp 1‘b’*的优先级高于*(cp 1)这是非法的ch后面的值未知cp非法是找ch后面的值*cp右值是ch后面的值左值是ch后面那个位置*cp右值是ch的值左值是ch的地址。但是cp移到下一个位置了。后缀的优先级高于*这里是1产生了cp的拷贝2操作cp3在cp的拷贝上实现间接访问⭐*cp‘b’和*都是从右向左结合的所以先间接访问。不能作为左值(*cp)‘a’因为先间接访问所以计算的值就是’a’随后ch的值1变’b’*cp先后移指针然后取值再1很少见*cp因为后缀的优先级高所以先移动cp然后间接访问到ch1后ch’b’此时cp还是指向ch后一个位置很少见
实例
size_t
strlen(char* string) {int length 0;/** 如果stringnull会报错因为自动移动但是访问冲突* 这里不检查是否为null是希望用户检查*/while ( *string ! \0){length 1;}return length;
}指针算术加减
指针1是移动到下一个位置而非下一个字节。比如int要4个字节那么int *ptr, ptr1时实际移动了4个字节并不是在指针内部移动。
指针减指针
只有在数组内有意义得到的结果是ptrdiff_t类型是一种有符号整数类型。这个结果除以数组类型的长度比如float是4就是坐标差。如果两个指针指向的元素不在同一数组这个结果就是未定义的。大部分编译器也不会检查是不是在一个数组。
指针的关系运算
同样在数组中有意义指 ≤ ≥。虽然标准允许指向数组元素的指针与数组最后一个元素后面的内存位置的指针比较但是不允许它与指向index0前一个位置的指针比较。不能保证移植性。