易错点总结
1,printf,cout 输出是从右往左压栈的。
1 int main(){ 2 int b=3; 3 int arr[]={6,7,8,9,10}; 4 int *ptr=arr; 5 *(ptr++) += 123; // 等同于 *ptr = *ptr+123; ptr=ptr++; ptr++ : 先用 ptr,再将 ptr++ 6 cout<<*arr<<endl; 7 printf("%d,%d\n",*ptr,*(++ptr)); //和下面输出相同,printf 计算参数时是从右往左压栈的; 8 cout<<*ptr<<*(++ptr)<<endl; //输出顺序从右往左 ;同上 ,输出 8 8 9 return 0; 10 }
2,类型转换。https://blog.csdn.net/gaoranfighting/article/details/44351831
1 #include<iostream> 2 #include<conio.h> 3 4 using namespace std; 5 6 int main(){ 7 float a = 1.0f; 8 cout<<(int)a<<endl; //1 9 cout<<&a<<endl; // 0x70fe3c 10 cout<<(int&)a<<endl; // 1065353216 11 cout<<boolalpha<<((int)a == (int&)a)<<endl; // false 12 13 float b = 0.0f; 14 cout<<(int)b<<endl; // 0 15 cout<<&b<<endl; // 0x70fe38 16 cout<<(int&)b<<endl; // 0 17 cout<<boolalpha<<((int)b == (int&)b)<<endl; // true 18 return 0; 19 }
3,const 的不同位置产生的区别:https://blog.csdn.net/u010571660/article/details/9623973
一个比较经典的问题--问以下两种声明的区别:
1)const char* p
2)char* const p
3)char const *p
这里的 const 关键字是用于修饰常量,书上说 const 将修饰离它最近的对象,所以,以上两种声明的意思分别应该是:
1)p 是一个常量字符的指针,不变的是 char 的值,即该字符的值在定义时初始化后就不能改变。(const char)
2)p 是一个指向字符的常量指针,不变的是 p 的值,即该指针不能再指向别的。(const p)
3)p 是一个指针,指针保存的是 char 类型,const 修饰的仍然是 char, 因为 const 只能修饰变量,不能修饰 * ,所以不变的仍然是 char 的值;(等同于 1 )
如何记忆呢?
Bjarne 在他的 《The C++ Programming Language》里给过一个助记的方法--------“以 * 分界,把一个声明从右往左读”。
注意语法:* 读作 pointer to (指向...的指针),const (常量)是形容词,char (类型变量)和 p (变量名) 都是名词。
1)const char* p 读作:p is a pointer to a const char ; 译为:p 是一个指针(变量),它指向一个常量字符(const char);
2)char* const p 读作:p is a const pointer to a char ; 译为:p 是一个常量指针(const p),它指向一个字符(变量)。
注意:
先看 const int a 和 int const a ,这里没有分界符 * ,虽然 const 的位置不同,但意思不变,它 const 修饰的是 int,常量整数;
再看 const char* p 和 char const *p ,首先以 * 分界,虽然 const 的位置改变了,但它都是在修饰 char ,字符常量;