如何理解C++中的各种指针?

长乐子 2013-05-13 02:16:35
比如:
1.指向const对象的指针
2.const指针
3.指向const对象的const指针
4.typedef定义的const指针
头晕中。。。
...全文
262 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
长乐子 2013-05-13
  • 打赏
  • 举报
回复
引用 13 楼 sophy520eangel 的回复:
通过一个例子来说明下关于#5楼的问题

#include<iostream>
#include<string>
#define PRINT(S) std::cout<<S<<std::endl;

int main(int , char** )
{
    //为string类型声明一个别名,别名为*ptrString
    //也就是说(*ptrString)表示string类型
    //那么ptrString表示指向一个string类型的指针类型
    //就是可以理解ptrString = std::string*
    typedef std::string *ptrString;

    //验证
    //1. 声明一个string类型变量str
    std::string str="pointer";

    //2.声明一个ptrString类型的便利pstr
    //其实这个时候pstr的类型 等于(string*)
    ptrString pstr = &str;

    //输出
    PRINT(str);
    PRINT(*pstr);

     //如果这个时候用const对ptrString类型的变量修饰那么
     //结果会是怎么样,看楼主的例子:
     // const ptrString pt;
     // 这个时候上面的例子等同于:
     // std::string const* pt  (不是const std::string * pt哦~ )
     //所以说明pt是一个指向std::string类型的指针,而且指针本身
     //是不能改变的~但是指针指向的数据确实可以改变的
     const ptrString pt = &str;
     std::string city = "fuzhou";
     //pt = city; //---> 错误,因为试图改变pt的值
     //*pt = city; //--->正确,因为改变的只是指针pt指向的数据~ 而没有改变pt本身的值
     PRINT(*pt);
     
     //ps: 希望以上有助你理解,其实typedef 定义的别名有时候可以把它拆分来理解的
     //好像tyepdef int (* fun)(int) 声明一样,你可以把(* fun)(int) 拆分开来
     //就比较好理解该句子所要表示的含义~
     //-------------------------------
    return 1;
}

谢谢!理解了。
hugett 2013-05-13
  • 打赏
  • 举报
回复
引用 16 楼 jeckykang 的回复:
[quote=引用 10 楼 hugett 的回复:] [quote=引用 8 楼 jeckykang 的回复:] 前面3个好理解,我比较纠结第四个。在C++ Primer中,它的解释: typedef定义的是指向string对象的const指针。 但是我理解成: 指向const类型的string对象的指针。 同学们帮我破解下。

typedef string * p;//p等价于string*
const p pt;//这里const是修饰p的。。也就是修饰指针的。。等价与string * const pt
[/quote] 这么说const放在类型的前后都是一个意思,都是用来修饰指针的。可以这样理解吧?[/quote] 就是这样~
长乐子 2013-05-13
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
这种做法会不会比较危险啊?为什么会有这种API啊?有什么特别的应用场景吗?
长乐子 2013-05-13
  • 打赏
  • 举报
回复
引用 10 楼 hugett 的回复:
[quote=引用 8 楼 jeckykang 的回复:] 前面3个好理解,我比较纠结第四个。在C++ Primer中,它的解释: typedef定义的是指向string对象的const指针。 但是我理解成: 指向const类型的string对象的指针。 同学们帮我破解下。

typedef string * p;//p等价于string*
const p pt;//这里const是修饰p的。。也就是修饰指针的。。等价与string * const pt
[/quote] 这么说const放在类型的前后都是一个意思,都是用来修饰指针的。可以这样理解吧?
就是那个党伟 2013-05-13
  • 打赏
  • 举报
回复
还是用吧。 用的多了才会记牢固。 用的少,背的多,用的时候照样不熟,而且时间一久立马混淆了。 多用!
quickSort 2013-05-13
  • 打赏
  • 举报
回复
供参考: http://blog.csdn.net/hello_world_2012/article/details/8674800http://blog.csdn.net/hello_world_2012/article/details/8674800
sophy520eangel 2013-05-13
  • 打赏
  • 举报
回复
通过一个例子来说明下关于#5楼的问题

#include<iostream>
#include<string>
#define PRINT(S) std::cout<<S<<std::endl;

int main(int , char** )
{
    //为string类型声明一个别名,别名为*ptrString
    //也就是说(*ptrString)表示string类型
    //那么ptrString表示指向一个string类型的指针类型
    //就是可以理解ptrString = std::string*
    typedef std::string *ptrString;

    //验证
    //1. 声明一个string类型变量str
    std::string str="pointer";

    //2.声明一个ptrString类型的便利pstr
    //其实这个时候pstr的类型 等于(string*)
    ptrString pstr = &str;

    //输出
    PRINT(str);
    PRINT(*pstr);

     //如果这个时候用const对ptrString类型的变量修饰那么
     //结果会是怎么样,看楼主的例子:
     // const ptrString pt;
     // 这个时候上面的例子等同于:
     // std::string const* pt  (不是const std::string * pt哦~ )
     //所以说明pt是一个指向std::string类型的指针,而且指针本身
     //是不能改变的~但是指针指向的数据确实可以改变的
     const ptrString pt = &str;
     std::string city = "fuzhou";
     //pt = city; //---> 错误,因为试图改变pt的值
     //*pt = city; //--->正确,因为改变的只是指针pt指向的数据~ 而没有改变pt本身的值
     PRINT(*pt);
     
     //ps: 希望以上有助你理解,其实typedef 定义的别名有时候可以把它拆分来理解的
     //好像tyepdef int (* fun)(int) 声明一样,你可以把(* fun)(int) 拆分开来
     //就比较好理解该句子所要表示的含义~
     //-------------------------------
    return 1;
}

zaixiankaifa 2013-05-13
  • 打赏
  • 举报
回复
自己多实践实践,然后对照着书去理解,这样就能比较好去深入领会其中的奥妙了
赵4老师 2013-05-13
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
hugett 2013-05-13
  • 打赏
  • 举报
回复
引用 8 楼 jeckykang 的回复:
前面3个好理解,我比较纠结第四个。在C++ Primer中,它的解释: typedef定义的是指向string对象的const指针。 但是我理解成: 指向const类型的string对象的指针。 同学们帮我破解下。

typedef string * p;//p等价于string*
const p pt;//这里const是修饰p的。。也就是修饰指针的。。等价与string * const pt
hugett 2013-05-13
  • 打赏
  • 举报
回复
引用 7 楼 jeckykang 的回复:
[quote=引用 6 楼 hugett 的回复:]

#include <iostream>

using namespace std;

int main()
{
	int a = 1, b = 2;
	const int * p1 = &a;//指向const对象的指针,所指的东西为const。。
	int * const p2 = &a;//const指针,自身的指向为const。。
	//*p1 = 2; //错误,不能改变指向const对象指针所指对象的值。。
	*p2 = 2;
	p1 = &b;
	//p2 = &b; //错误,不能改变const指针的指向。。
	return 0;
}
至于指向const对象的const指针就是上述两种指针的效果之和。。
int a = 1, b = 2; 是不是应该为:const int a = 1, b = 2;[/quote] a,b可以不为const。。。指向const对象的指针只是说不能通过指针来改变所指对象的值,但可以通过变量名改变对象的值。。

	int a = 1;
	const int *p = &a;
	*p = 2; //错误
	a = 2;  //OK
长乐子 2013-05-13
  • 打赏
  • 举报
回复
前面3个好理解,我比较纠结第四个。在C++ Primer中,它的解释: typedef定义的是指向string对象的const指针。 但是我理解成: 指向const类型的string对象的指针。 同学们帮我破解下。
长乐子 2013-05-13
  • 打赏
  • 举报
回复
引用 6 楼 hugett 的回复:

#include <iostream>

using namespace std;

int main()
{
	int a = 1, b = 2;
	const int * p1 = &a;//指向const对象的指针,所指的东西为const。。
	int * const p2 = &a;//const指针,自身的指向为const。。
	//*p1 = 2; //错误,不能改变指向const对象指针所指对象的值。。
	*p2 = 2;
	p1 = &b;
	//p2 = &b; //错误,不能改变const指针的指向。。
	return 0;
}
至于指向const对象的const指针就是上述两种指针的效果之和。。
int a = 1, b = 2; 是不是应该为:const int a = 1, b = 2;
hugett 2013-05-13
  • 打赏
  • 举报
回复

#include <iostream>

using namespace std;

int main()
{
	int a = 1, b = 2;
	const int * p1 = &a;//指向const对象的指针,所指的东西为const。。
	int * const p2 = &a;//const指针,自身的指向为const。。
	//*p1 = 2; //错误,不能改变指向const对象指针所指对象的值。。
	*p2 = 2;
	p1 = &b;
	//p2 = &b; //错误,不能改变const指针的指向。。
	return 0;
}
至于指向const对象的const指针就是上述两种指针的效果之和。。
长乐子 2013-05-13
  • 打赏
  • 举报
回复
引用 2 楼 sophy520eangel 的回复:
楼主不理解的不是指针,而不是对加const修饰的指针所表述的含义有点模糊,其实加const修饰就三种情况 1。一种修饰指针本身(这意味着指针的地址是固定的无法改变) 2。一种是修饰指针指向的数据(这意味着指针指向的数据时无法改变的但是指针本身是可以发生改变的) 3。即修饰指针本身又修饰指针指向的数据 这里有篇文章可能有助于楼主理解 http://www.codeguru.com/cpp/cpp/cpp_mfc/general/article.php/c6967/Constant-Pointers-and-Pointers-to-Constants.htm
嗯,尤其是那个typedef的定义啊。 typedef string *p; const p pt; 或者 typedef string *s; s const spt; 这两种到底有没有区别啊?
starytx 2013-05-13
  • 打赏
  • 举报
回复
1 const int *p; // 或者int const *p,都表示指向const对象的指针,表示指针指向的内容不可改变 2 int * const p; // const修饰的是p,表示一个const指针,p必须初始化,我这个写法是编译不通过的,因为没有初始化,因为是const指针,所以初始化以后不可以再指向其他对象 3 const int *cosnt p; //这个就不用解释了吧,指向的对象的值不可变,指针也不可指向其他对象 4 ?
derekrose 2013-05-13
  • 打赏
  • 举报
回复
我感觉也很蛋疼
sophy520eangel 2013-05-13
  • 打赏
  • 举报
回复
楼主不理解的不是指针,而不是对加const修饰的指针所表述的含义有点模糊,其实加const修饰就三种情况 1。一种修饰指针本身(这意味着指针的地址是固定的无法改变) 2。一种是修饰指针指向的数据(这意味着指针指向的数据时无法改变的但是指针本身是可以发生改变的) 3。即修饰指针本身又修饰指针指向的数据 这里有篇文章可能有助于楼主理解 http://www.codeguru.com/cpp/cpp/cpp_mfc/general/article.php/c6967/Constant-Pointers-and-Pointers-to-Constants.htm
nirvana_newbie 2013-05-13
  • 打赏
  • 举报
回复
1.指向const对象的指针 const (int *)p; 2.const指针 (int *) const p; 3.指向const对象的const指针 const (int *) const p; 4.typedef定义的const指针 typedef int * pint; pint const p;
1. C 语言指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C可变参数函数实现 38 8. C程序内存组成部分 41 9. C编程拾粹 42 10. C语言实现数组的动态增长 44 11. C语言的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 108 22. C语言编程易犯毛病集合 112 23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static存储空间矛盾 145 31. PC-Lint与C\C++代码质量 147 32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI Cstruct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数指针数组与返回数组指针的函数 186 38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 236 50. 游戏外挂的编写原理 254 51. 程序实例分析-为什么会陷入死循环 258 52. 空指针究竟指向了内存的哪个地方 260 53. 算术表达式的计算 265 54. 结构体对齐的具体含义 269 55. 连连看AI算法 274 56. 连连看寻路算法的思路 283 57. 重新认识:指向函数的指针 288 58. 链表的源码 291 59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66. 关于指向指针指针 368 67. C/C++ 误区一:void main() 373 68. C/C++ 误区二:fflush(stdin) 376 69. C/C++ 误区三:强制转换 malloc() 的返回值 380 70. C/C++ 误区四:char c = getchar(); 381 71. C/C++ 误区五:检查 new 的返回值 383 72. C 是 C++ 的子集吗? 384 73. C和C++的区别是什么? 387 74. 无条件循环 388 75. 产生随机数的方法 389 76. 顺序表及其操作 390 77. 单链表的实现及其操作 391 78. 双向链表 395 79. 程序员数据结构笔记 399 80. Hashtable和HashMap的区别 408 81. hash 表学习笔记 410 82. C程序设计常用算法源代码 412 83. C语言有头结点链表的经典实现 419 84. C语言惠通面试题 428 85. C语言常用宏定义 450

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧