C/C++:指针

本文深入探讨了指针类型的重要性,解释了指针为何需要类型,以及如何通过指针进行有效的内存管理。文章详细分析了不同内存区域如全局静态区、常量数据段、栈和堆的特点,并通过实例演示了指针操作的细节与潜在陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么指针要有类型?{\red{为什么指针要有类型?}}

因为指针有自增自减运算,只有指针有类型时,指针加1就是向后移动一个类型对象的空间。


内存管理{\red{内存管理}}

全局静态区:{\green{全局静态区:}} 全局变量,静态变量

常量数据段:{\green{常量数据段:}} 常量

栈:{\green{栈:}} 编译器使用的临时变量

堆:{\green{堆:}} 程序员管理的内存

int main(){
	// 栈
    char a1[] = "abc";  
    char a2[] = "abc";
    const char b1[] = "abc";  
    const char b2[] = "abc";
    // 常量
    char *c1 = "abc"; 
    char *c2 = "abc";
    const char *d1 = "abc";  
    const char *d2 = "abc";
    // 地址
    cout<<(a1==a2)<<endl;
    cout<<(b1==b2)<<endl;
    cout<<(c1==c2)<<endl;
    cout<<(d1==d2)<<endl;
    cout<<(c1==d1)<<endl;
    return 0;
}

输出:{\orange{输出:}} 0 0 1 1 1

栈变量地址都是不同的,常量地址会根据内容优化{\green{栈变量地址都是不同的,常量地址会根据内容优化}}


关于通过指针修改常量:{\red{关于通过指针修改常量:}}

char *p = "abc";
p[0] = 'b';

编译不会错误,运行错误{\orange{编译不会错误,运行错误}}

编译只会检查类型,语法。

运行错误是因为,当指针试图修改常量区时则抛出错误。


关于this指针{\red{关于this指针}}this

静态成员函数无this指针

友元函数无this指针


示例:p[0]==∗(p+0){\red{示例:p[0] == *(p+0) }}p[0]==(p+0)

char *str[] = {"Welcome","to","Fortemedia","Nanjing"};
char **p = str + 1;
str[0] = (*p++) + 2;
str[1] = *(p+1);
str[2] = p[1] + 3;
str[3] = p[0] + (str[2] - str[1]);
printf("%s\n",str[0]);
printf("%s\n",str[1]);
printf("%s\n",str[2]);
printf("%s\n",str[3]);

输出:{\orange{输出:}}

“”

“Nanjing”

“jing”

“g”

分析:{\green{分析:}}

pointerA

pointerB

pointerC

pointerD

最后:{\orange{最后:}}

pointerE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值