2022.9.9实训笔记

122 阅读3分钟

指针是变量

1.系统为指针分配内存空间 2.指针有自己的地址 3.指针能够存值,但这值比较特殊-地址 4.有效的指针不是整数值,需要进行转换,如 char* p = (char *)0x4000000h; 5.在64系统中,typeof(指针)=8,地址占8字节

int *ptr; //指针的类型是int* 
char *ptr; //指针的类型是char* 
int **ptr; //指针的类型是int** 
int (*ptr)[3]; //指针的类型是int(*)[3]
int *(*ptr)[4]; //指针的类型是int*(*)[4]

指针的值

指的是指针本身存储的数值,编译器当作地址,而非一般的数值。在32位系统里,所有类型的指针的值都是一个32位整数,因为32位系统中的地址全都是32位长,即地址总线是32位,寻址空间是32位。在Centos 64bit系统中,指针的值是64位,即8字节。 比如说指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域,长度为sizeof(指针所指向的类型)。

在某台机器上,float占4字节,在运算float型指针+3的表达式时,

float f = 1; float* ptr = &f; ptr+=3;

这个3将根据float类型的大小进行调整,这样实际加到指针上的数值是3*4=12字节。即增加3个float的大小.


//当const在*之前就是常量指针;在*之后就是指针常量。 const char *p;
//定义了一个常量指针,即指向一个常量,指向的内容是常量,不可修改,放在常量区。但指针本身可以修改。 
char * const p = a; //定义了一个指针常量,即指针是常量,不可修改。但指针所指向的内容可以修改。 
char* p = "abc"; 
//声明了一个常量字符串,存储在静态存储区的常量存储区。值不可个改,但指针p可以修改。 如 
int main(void) { 
char *p = "abc"; //Segmentation fault 
//char p[] = "abc"; //Ok 
*p = 'e'; 
printf("%s\n", p); 
}

局部变量和全局变量

在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。

//local variable address from high to low
//array elements address from low to high
int x =3,y=0,*px = &x;
y = *px + 5;
printf("%d\r", y);

y=++*px;
printf("%d\r", y);

printf("addr.px:%x\r", px);
y=*px++;
printf("%d\r", y);

printf("addr.px:%x\r", px);
printf("%d\r", *px);
printf("addr.x:%x\r", &x);
printf("addr.y:%x\r", &y);

px--;
printf("%d\n", *px );