1、指针与取地址相关赋值时,注意赋值号左右同等级。
2、不同级的指针在赋值号左右加减,会指向随机处。
3、
char *str[] = ** str
也就是说数组符号可以看作一个*的级
即str是char**类型的
且数组各单元都是指针
指向char
但*str 其实是char*类型
指向*str数组中第一个单元的第一个字符
相当于是*str[]作为**级,剥离了一个[],所以变成了char *级
在这里把字符串看作数组更好理解
str+1 也是一个指针,它指向数组的第1 号单元
4、
*(str+1)也是一个指针,它的类型是char
指向数组第1号单元的第一个字符
有例子如下
struct MyStruct
{
int a;
int b;
int c;
};
struct MyStruct ss={20,30,40};
struct MyStruct *ptr=&ss;
//声明了一个指向结构对象ss 的指针。它的类型是
//MyStruct *,它指向的类型是MyStruct。
ptr->a; //指向运算符,或者可以这们(*ptr).a,建议使用前者
ptr->b;
ptr->c;
int *pstr=(int*)&ss;
//声明了一个指向结构对象ss 的指针。但是pstr 和
//它被指向的类型ptr 是不同的
(部分笔记摘自让你不再害怕指针——C指针详解(经典,非常详细)-CSDN博客)
*pstr; //访问了ss 的成员a。
*(pstr+1); //访问了ss 的成员b。
*(pstr+2) //访问了ss 的成员c。
后者的方法是不好的,理由如下
有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个"填充字节",这就导致各个成员之间可能会有若干个字节的空隙。
*pstr 访问到了结构对象ss 的第一个成员变量a,也不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a 和成员b 之间可能会有若干填充字节,说不定*(pstr+1)就正好访问到了这些填充字节
所以一般用ptr前者
5、
两个指针指向同一地址时,其中一个指针变化不影响其他指针。
6、
对指针强制类型转换,用(类型*)
如(int*)
强制转换指针类型时出现会安全问题
如改变类型造成的字节占用变化,可能改变代码内容完整性,造成代码程序崩坏
使用指针访问数组时,不要超过界限。