*号意义: 1.乘法 2. int *p 声明指针 3. p=&a; *p = 100; 解引用
int *s *和变量名结合; int *p,r; (指针,整型)
指针种类: 空指针,野指针,失效指针
指针大小:32位 4个字节,64位 8个字节。
&ip => 0x00d5f8ec &ip => 0x00d5f8ec
ip => 0x00d5f904 ip => 0x00d5f8f8
*ip => a (等价) *ip => b
&*ip <=> &a (等价)
定义指针变量时,类型对指针变量起到2个作用。
1.解析存储单元的大小;
2.指针变量加1的能力。
typename *p;
p = p +1;被编译器解释成: p = p + sizeof(typename);
指针和整型加减后的结果仍是指针类型
后置++,是在所有语句执行完之后++; x = *p++; ==> int x = *p; p++;
x = (*p)++; ==> int x = *p; (*p)++;
* 和 &
eg: int a = 10; int *p = &a;
*&a 可以理解为 *(&a), &a 是 a 的地址,*(&a) 是取这个地址上的数据 ==> a;
&*p 可以理解为 &(*p), *p 是 a, &*p 是 a的地址 ==> p;
指针与数组
数组名被看作该数组的第一个元素在内存的首地址(仅在 sizeof 中例外,是数组所占内存大小),数组名在表达式中被自动转换成为一个指向数组第一个元素的指针常量。
作为首地址,为指针常量,不允许 ++ar, ar = ar+1;
ar[i] <==> *(ar+i) <==> i[ar]
下标运算符[ ]是以指针作为操作数的,ar[i] 被编译系统解释为 *(ar + i)。
指针与const
const 在 * 左边 const int* 修饰指向; const 在 * 右边 int* const修饰指针本身;
consr int* p2 = &a; 可以读取,可以改变p2本身,不能改变指向的值。 int x = *p2;可以 p2 = &b;可以 不可以 *p2 = 200;
int* const p4 = &a; int x = *p4;可以 *p4 = 200; 可以 p4 = &b;不可以 int* s = p4; 可以
无类型指针void
void *p =nullptr; //泛型指针,是指针就都可以给void指针变量赋值;但是无法解析,无法+1;
sizeof(p); // 4 8 不可以解引用 sizeof(*p)
如果要给其他指针赋值,必须要进行强转; void *p; int *ip = (int *)p; double *dp = (double*)p;