1、常量指针VS指针常量
const int* 和int const* int 一样,就是常指针 也就是它所指向的数据(在这是int)是常量,它自己的数据类型是const int*
1 int* const p; // 指针常量 指针p指向的值不可修改 const修饰的是 p2 3 const int* p; // 常量指针 指针p不可修改 const修饰的是 *p4 int const* p; // 常量指针 指针p不可修改2、指针数组VS指向数组的指针
指针数组,是指数组元素为指针的数组
1 int* P[N];指向数组,的指针指的是数组中的每个元素是一个指针
1 int (*P)[N];3、sizeof数组和指针
1 int arr[5];2 cout<<sizeof(arr); // 输出是20因为是sizeof(int)*5
可以用通过它来计算一个数组的元素个数
当数组是函数的参数时,sizeof对它不可用
因为指针本身是32位四个字节的
所以
1 char* p; 2 sizeof(p) == 4;标准C++中 其返回类型为size_t
标准C++的 sizeof还可以作用于对象
sizeof引用 返回引用对象的存储大小
sizeof指针的解引用 返回解引用的空间大小
4、数组引用
1 int (&arr)[N];5、指向函数的指针
1 int (*fun)(int, int)6、函数接口中的指向指针的指针
7、 || 和 && 操作符第一个操作数往往能决定最终结果 从而忽略第二个操作数
8、%的操作数要是整形
9、!对于非0操作 结果是fasle
10、判断bool的变量val是否成立时候 通常用if(val)
11、位异或是^ 就是位的非进位加法
12、*p++相当于 *(p++) 由于++在后 还是对原先的p进行解引用的
13、if((i = 5) > 0) 先赋值 再判断 注意为什么加括号
14、i = p = 7; 这里是右结合的
15、*iter.empty(); . 的优先级高一些 所以是错误的表达
16、iter++->empty(); 先empty再++
17、条件表达式的优先级相当低
cout<<(i < j ? i : j);
cout<<(i < j) ? i : j; // 等价于cout ? i : j
cout<<i < j ? i : j; // 错误 cout < j ? i : j
18、优先级的判断
19、new和delete
int *p = new int(10);
int *p = new int[10];
int *p = new int[10](10);
delete是针对内存的 不是new出来的内存就无法释放了
int i;
int *p = &i;
delete p; // error 但是大部分编译器还能通过
如果p = NULL;
delete p也是安全的
const int *p = new const int(1024);
new出来的const不可被修改但同样可以被删除
delete p;
20、 可变参数
1 void va_start( va_list arg_ptr, prev_param );2 type va_arg( va_list arg_ptr, type );3 void va_end( va_list arg_ptr ); 1 void simple_va_fun(int i, ...)2 {3 va_list arg_ptr;4 int j=0; 5 va_start(arg_ptr, i);6 j=va_arg(arg_ptr, int);7 va_end(arg_ptr);8 printf("%d %d/n", i, j);9 return;10 }1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变量是指向参数的指针。 2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。 3)然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个参数是你要返回的参数的类型,这里是int型。 4)最后用va_end宏结束可变参数的获取.然后你就可以在函数里使用第二个参数了.如果函数有多个可变参数的,依次调用va_arg获取各个参数。
21、main的参数
main(int argc, char*argv[])
参数字符串 列表是argv
参数个数是argc
22、main的返回值
主函数main的返回值为EXIT_FAILURE EXIT_SUCCESS返回失败和成功在 cstdlib.h中定义
通常情况下返回0是成功,大部分返回非0表示失败
23、返回引用是高效的,但是返回局部量的引用是错误的
24、返回引用是可以是左值的
1 char &get_val(string &s, string::size_type n)2 {3 return s[n];4 }5 6 main()7 {8 string s("this is a string");9 get_val(s, 0) = 'A';10 }