C语言基本概念(一)

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=5

p=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<


5. *_t变量中t的意义
_t是一个结构的标注,可以理解为type或typedef的缩写,表示它是typedef定义的

    





你可能感兴趣的:(C语言基本概念(一))