#运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针

#运算符:用于在预编译期将宏参数转换为字符串

#define CONVERS(x)  #x   //注:没用双引号包括。

 

不同类型的指针占用的内存空间大小相同。

 

局部变量 定义:

a[5];

打印a[i]时,a[i]为随机数。

若定义a[5]={1,2};

打印时,a[0]=1;a[1]=2;a[2]=a[3]=a[4]=0;

 

数组地址与数组名:

1.数组名代表数组首元素的地址。  a=&a[0];

2.数组的地址需要用取地址符号&才能得到 (&a)

3.数组首元素的地址值与数组的地址值相同。

4.数组首元素的地址与数组的地址是两个不同的概念。

a+1:(unsigned int)a+sizeof(*a)//加上一个元素大小。

&a+1:(unsigned int)(&a)+sizeof(*&a)//加上整个数组大小。

 

指针和数组

编译器对数组和指针处理不同。

处理指针:一次寻址操作。

char *p=“HW”

访问p时->先找到内存空间->再从内存空间取得地址->根据地址找到HW。(做了一次寻址操作)

处理数组:无寻址,直接去访问。

char p[] = "HW"

 

指针的运算:与整数的运算规则为

P+n:(unsigned int)p+n*sizeof(*p);

指针之间的减法:注此指针必须类型相同

P1-P2:((unsigned int)p1-(unsigned int)p2)/sizeof(type);

结论:

1.当指针P指向一个同类的数组的元素时:

P+1:将指向下一个元素。

P-1:将指向上一个元素。

2.当2个指针指向同一个数组中的元素时,指针相减才有意义,为指针所指向元素的下标差。

 

堆区:申请的内存空间 heap。

栈区:局部变量  stack

静态区:静态变量,全局变量空间。

只读区:分配常量和程序代码空间

在main.cpp

int a=0; //全局初始化区
char *p1;//全局未初始化区
main()
{
      int b;//栈区
      char s[] = "abc";//栈区
      char *p2; //栈区
      char *p3 = "123456";123456在常量区,P3在栈区
      static int c = 0;全局(静态)初始化区
     P1=(char*)malloc(10); //
    
}

 

求一个数组中元素的个数:

DIM(a) = sizeof(a)/sizeof(*a);

 

下标VS指针:

1.从理论上而言,当指针以固定增量在数组中移动时,其效率高于下标产生的代码(下标时,乘法很耗时)。

2.当指针增量为1且硬件具有硬件增量模型时,表现更佳。

 

posted on 2017-09-17 16:19  白宫飘红旗  阅读(177)  评论(0编辑  收藏  举报