1. define与typedef的区别
(1) #define是宏命令,如同文本编辑的替代命令,在编译前把程序中的所有遇到的词全部替代后再由编译器编译
eg: #define uchar unsigned char
(2)typedef本身是一种存储类的关键字,为复杂的声明定义简单的别名。
eg: typedefunsigned char uchar;
(3)关于二者区别的一个例子:
#defien int_ptr int *
int_ptr a,b; //相当于int *a,b; 只是简单的宏替换,其中a是一个整型的指针变量,b是
一个整型数值变量
typedef int * INT_PTR;
INT_PTR a,b; //a,b都为指向int的指针,typedef为int *引入一个新的助记符
2. 定义指针时*应该跟着前面的类型还是后面的变量
最好是跟着后面的变量,虽然int*p,int * p, int *p对编译器来说其实是一样的。
int *a, b; 这样可以轻松地知道a是指针,b是值;
int* a, b; 看上去像a和b都是指针,但其实不是 。
3. *与&的区别
*为取值,&为取地址。一个例子:
#include
using namespace std;
int main()
{
int a = 5;
int *p = &a;
cout << "a = " << a<< endl
<< "&a = " <<&a << endl
<< "*p = " << *p<< endl
<< "p = " << p<< endl
<< "&p = " <<&p << endl;
return 0;
}
输出结果为:
a=5
&a= 0026F9EC
*p=5p=0026F9EC
&p=0026F9F0 //存储指针p的地址。0026F9F0比0026F9EC大4个字节,刚好存储指针p的32位地址
4.const int *p 与 int * const p 的区别
(1) const int *p;//const修饰的是数值*p,故*p是常量不能改变,但可以改变指针p的指向:
eg1.1: int b=1,c=2;
const int *a=&b;
*a=10; //本句错误
cout<<*a<
这个例子编译时会报错,提示"a":不能给常量幅值。
eg1.2: int b=1,c=2;
const int *a=&b;
cout<<*a<
这个例子能输出结果 1 2
(2) int * const p; //const修饰的是指针p,因此p的指向是常量不能改变,但*p可以改变
eg:2.1: int b=1,c=2;
int *const a=&b;
a=&c; //本句错误,已经在上一句给常量指针a赋值为&b
cout<<*a<
这个例子编译时会报错,提示"a":不能给常量幅值。
eg:2.2 int b=1,c=2;
int *const a=&b;
*a=10;
cout<<*a<
这个例子能输出结果10。因为指针a在初始化中指向了int 变量b,故*a=10实际上也改变了b的值,cout<