C的指针疑惑:C和指针6(指针)
NULL:
对所有指针变量进行显式的初始化是种好事:(1)如果你知道指针将被初始化为什么地址,就直接初始化该地址,
(2)否则把它初始化位NULL.
注意:假定变量a存储于位置100.
×100 =25
看上去像是把25赋值给a,因为a是位置100所存储的变量。但这是错误的,这条语句是非法的。因为字面值100的类型是整形,而间接访问操作只能作用于指针类型表达式。
正确:
×(int ×)100 =25
强制类型转换把值100从“整形”转换为“指向整形的指针”
这种技巧运行之处:你偶尔需要通过地址访问内存中某个特定的位置。
前缀++:先增加它的操作数的值再返回这个结果。
后缀++:先返回cp值的一份copy,然后再增加cp的值。
易错点:
char ch = 'a' char *cp = &ch;
此时的×cp++代表什么????
结果是:它的右值和左值分别是变量ch的值和ch的内存位置,也就是cp原先所指。
定人误解的地方:后缀++操作符的优先级高于*操作符。但表达式结果看上去是像先执行间接访问操作。
实际:这里有三个步骤
(1)++操作符产生cp的一份拷贝
(2)然后++操作符增加cp的值
(3)最后在cp的拷贝上执行间接访问操作。
*cp++:这个表达式常常在循环中出现,首先用一个数组的地址初始化指针,然后使用这种表达式就可以依次访问该数组的内容了。
#include <stdio.h> #include <stdlib.h> size_t strlen_test(char *string) { int length = 0; while(*string++ != '\0') length += 1; return length; } int main(void) { int rec= 0; char *m_string = "I am liuxj"; rec = strlen_test(m_string); printf("rec is %d\n", rec); }
C语言中存储一个字符串:
(1):字符指针
(2):使用字符数组
const char *str = "hello"; const char str[] = "hello";
两个指针相减(前提:两个指针指向同一个数组中的元素)的结果:是两个指针在内存中的距离(以数组元素的长度位单位,而不是以字节位单位),因为减法运算的结果将除以数组元素类型的长度。
两个指针的关系运算: <, <=, >, >=
比较将会告诉你,哪个指针指向数组中更前或更后的元素。