【笔记】学习c语言指针

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*)

强制转换指针类型时出现会安全问题

如改变类型造成的字节占用变化,可能改变代码内容完整性,造成代码程序崩坏

使用指针访问数组时,不要超过界限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值