我们知道,字符数组和字符指针都可以用来处理字符串,例如下面的两条语句都是正确的:
1 | char *p = "abc"; |
第二行代码大家都知道是正确的,下面我主要来解释一下第一行代码,第一行代码是将字符串赋给一个字符指针,这个该怎么理解呢?实际上,在第一行代码中,编译器首先在内存中开辟一块存储区域来存储字符串中的每个字符,是以 'a','b','c',''
这样的形式进行存储的,然后用字符指针 p 指向该存储区域的第一个字符的位置,如下图所示:
我们知道,字符数组和字符指针都可以用来处理字符串,例如下面的两条语句都是正确的:
1 | char *p = "abc"; |
第二行代码大家都知道是正确的,下面我主要来解释一下第一行代码,第一行代码是将字符串赋给一个字符指针,这个该怎么理解呢?实际上,在第一行代码中,编译器首先在内存中开辟一块存储区域来存储字符串中的每个字符,是以 'a','b','c',''
这样的形式进行存储的,然后用字符指针 p 指向该存储区域的第一个字符的位置,如下图所示:
递归是我们在编程过程中用到的一种思想,当一个函数自身调用自身的时候,无论是直接或者间接地调用,都属于递归,下面对于什么时候用到递归以及怎么用递归,谈一点我个人初步的想法。
被调函数的返回类型决定返回的是左值还是右值,当被调函数的返回类型是 引用 时,返回的是左值,其余情况下返回的是右值,被调函数返回的左值有着与其他左值类型同样的运算特性,需要特别指出的是, 我们能为返回类型是非常量引用的函数的结果赋值 ,但是需要注意的是,进行运算的前提是确保返回的引用是有效的, 返回与局部对象绑定的引用是无效的 ,因为被调函数运行结束时,局部对象的存储空间已经释放,返回与局部对象绑定的引用将会产生错误的结果,要想确保返回值的安全,我们不妨自问:引用绑定的是被调函数运行前的哪一个对象?然而,在某些时候,也是容易让人产生混淆的,譬如下面的代码,在很多人看来是错误的,但事实并非如此:
为了讲清楚我们要说明的问题,首先我们来定义一个二维数组:
1 | int ival[2][3] = { |
这是一个2行3列的二维数组,如果我们要使用范围 for 循环来输出这个二维数组中的元素的话,相应地代码如下:
1 | for (auto &row : ival) { |
主要参考资料:我在 Stackoverflow 上提的问题 Why the first is right but the second is wrong ?
以下内容系原创,转载请务必注明地址
在 Android 手机上使用 Terminal IDE 远程登录你的 Mac 可以让你随时随地远程对你的 Mac 进行操作,这个很爽,特别是当你躺在床上还能操作你在某个地方开着的 Mac 计算机的时候,其实依照这种方法也可以类似地远程登录Ubuntu,有兴趣的可以试试,简单几步就可以实现了:
指向数组的指针与指向数组首元素的指针究竟有什么区别呢?有人说,这二者不是一回事么?它们就是同一个东西啊!然而,事实并非如此,下面我细细道来。
首先,我们定义一个一维数组来具体分析一下,这个数组含有10个整数:
1 | int ia[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; |
我们再来定义指向这个数组的指针:
1 | int (*p)[10] = &ia; |
本文的主要参考来源来自于:C++ Primer 中文版(第 5 版) 第 57 面至第 58 面。
我们知道,指针本身是一个对象,因为,指针实际对应着内存单元的一段存储空间,然而,指针所指向的也是一个数据对象,因此,指针是一个常量与指针所指向的是一个常量是两个完全不同的概念, 顶层 const 表示的是 指针本身是一个常量, 底层 const 表示的是 指针所指的对象是一个常量,更一般情况下, 顶层 const 可以表示任意对象是一个常量,这对于算术类型、类、指针等任何数据类型都是成立的, 底层 const 则与指针和引用等复合类型的基本类型部分有关 ,比较特殊的是,指针既可以是顶层 const 也可以是底层 const ,这一点与其他类型区别明显。
当某个运算符的运算对象类型不一致,且其中某一个运算对象是无符号类型时,这个需要进行相应地类型转换,至于类型转换的结果,则 依赖于机器中各个整数类型的相对大小 。
对于 C++ 中的左值和右值,我们通常的说法是:当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置),这句话来自于 《C++ Primer 第五版》 第 121 页,那么,对于这句话,该作何理解呢?下面我想来谈谈我的看法。