#运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标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且硬件具有硬件增量模型时,表现更佳。