1 #define与typedef
define是直接替换
#define a(x, y) x + y
cout << a(3, 5) * a(3, 5) << endl;
// 3 + 5 * 3 + 5 = 23
#define a(x, y) (x+y)
cout << a(3, 5) * a(3, 5) << endl;
// (3 + 5) * (3 + 5) = 64
typedef:类型别名
typedef double* p;
cout << typeid(p).name() << endl; / p是double *类型
typedef中const是修饰p的,而非修饰p所指的对象。
const p ptr = 0; / ptr是double * const类型,是指向double的常量指针。
const p *a; / a是一个指针,所指对象是“指向double的常量指针”
typedef void ( * sighandler_t)(int)
这句话的含义:sighandler_t表示函数指针类型(指向函数的指针),函数返回值为void,参数为int类型。
捕捉信号函数中:参数handler和返回值都是这个类型。
sighandler_t signal(int signum, sighandler_t handler);
typedef void (*sighandler_t)(int)
2 函数返回数组指针怎么写
①使用类型别名
typedef int arrT[10]; /array是一个类型别名,表示的类型是含有10个整数的数组,arrT相当于int [10]
using arrT = int[10]; /arrT的等价声明,同第一条
arrT* func(int i); /func返回一个指向含有10个整数的数组的指针
②普通表示法
int arr[10];
int (*p)[10] = &arr; /p是指向含有10个整数的数组的指针
int (*(func (int i)) [10]; /函数func的返回类型是“指向含有10个整数的数组的指针”
Primer P205
③尾置返回类型 C++11
任何函数定义都可以使用尾置类型返回,但是这种形式对于返回类型比较复杂的函数最有效,比如返回类型是数组的指针或引用。 注意要在原位置放置auto
auto func(int i) -> int (*) [10];
④使用decltype
int odd[] = {1,3,5,7,9};
decltype(odd) *func(int i); /decltype的结果是一个长度为5的int数组,加一个*表示该函数返回值是“指向含有5个整数的数组的指针”
3 char每次移动1个字节;short移动2个字节 ;int , long ,float移动4个字节 ;double移动8个字节
p1指向字符型,一次移动一个字符型,1个字节;p1+5后移5个字节,16进制表示为5;
p2指向长整型,一次移动一个长整型,4个字节,p2+5后移20字节,16进制表示为14。
对字符串进行sizeof操作的时候,会把字符串的结束符"\0"计算进去的,进行strlen操作求字符串的长度的时候,不计算\0的。
数组作为函数参数传递的时候,已经退化为指针了,Func函数的参数str_arg只是表示一个指针,那个100不起任何作用的。
该题的关键是要认清楚强制类型转换后指针的类型。
p的类型为char *,p++后p指向str数组的第2个元素即字母“l”的位置。
p1的类型为int *,p1++后p1指向的位置增加4个字节,指向str数组中的第6个元素即字母“t”的位置。
4 位运算
位运算规则及常用实例
注意&运算的优先级比 << >> 低