*p操作内存
- 在指针声明时,*号表示所声明的变量为指针
- 在指针使用时,*号表示操作指针所指向的内存空间中的值
- *p相当于通过地址(p变量的值)找到一块内存;然后操作内存
- *p放在等号的左边赋值(给内存赋值)
- *p放在等号的右边取值(从内存获取值)
指针变量和它指向的内存块是两个不同的概念
- 含义1 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容;p = p +1; p++
- 含义2 给_p赋值_p=’a’; 不会改变指针变量的值,只会改变所指的内存块的值
- 含义3 =左边_p 表示给内存赋值, =右边_p 表示取值含义不同切结!
- 含义4 =左边char *p
- 含义5 保证所指的内存块能修改(常量是不能修改的)
示例
void main(){int a = 10;char *p1 = 100;//指针变量 分配4个字节的内存 (给内存赋值)char ****p2 = 100;int *p3 = NULL;p3 = &a;*p3 = 20; //间接修改a的值 a=20// *就像一把钥匙 通过一个地址(&a),去改变变量的标示的空间int c = *p3;//取值 c=20printf("%d\n", c);printf("a:%d,p1:%d,p2:%d\n", sizeof(a), sizeof(p1), sizeof(p2));//4 4 4{char *p4 = NULL;p4 = (char *)mollac(100);p4 = (char *)mollac(200);/*p4在栈中 指向堆中 100的内存空间地址(0xbb11)后又指向堆中 200的内存空间地址(0xcc11)总结:不断的给指针变赋值,相当于不停的改变指针方向*/}system("pause");return;}

- *就像一把钥匙 通过一个地址(&a),去改变变量的标示的空间
- 不断的给指针变赋值,相当于不停的改变指针方向(和所指向内存空间没有任何关系)
指针是一种数据类型,是指它指向的内存空间的数据类型
- 含义1:指针步长(p++),根据所致内存空间的数据类型来确定
p++ => (unsigned char )p+sizeof(a); - 结论:指针的步长,根据所指内存空间类型来定。
/*int getAbc1(char *p1);int getAbc2(char **p2);int getAbc3(char ***p3);int getAbc4(char (*p4)[30]);int getAbc5(char p5[10][30]);指针做函数参数,形参有多级指针的时候站在编译器的角度,只需要分配4个字节的内存(32bit平台)当我们使用内存的时候,我们才关心指针所指向的内存是一维的还是二维的重点:指针是一种数据类型,是指它指向的内存空间的数据类型*/
指针也是一种变量,占有内存空间,用来保存内存地址
测试指针变量占有内存空间大小
#include <stdio.h>// 引用int main12 () {char a = 1 ;short b = 2;int c = 3;long d = 4;float e = 1.2;double f = 2.3;printf("&a = %p\n", &a);printf("&b = %p\n", &b);printf("&c = %p\n", &c);printf("&d = %p\n", &d);printf("&e = %p\n", &e);printf("&f = %p\n", &f);// &a = 0028FEBF// &b = 0028FEBC// &c = 0028FEB8// &d = 0028FEB4// &e = 0028FEB0// &f = 0028FEA8printf("a = %d\n", *(&a));printf("b = %d\n", *(&b));printf("c = %d\n", *(&c));printf("d = %d\n", *(&d));printf("e = %f\n", *(&e));printf("f = %f\n", *(&f));// a = 1// b = 2// c = 3// d = 4// e = 1.200000// f = 2.300000printf("a = %d\n", *((char *)0x0028FEBF)); // (char *)0x0028FEBF == &aprintf("b = %d\n", *((short *)0x0028FEBC));printf("c = %d\n", *((int *)0x0028FEB8));printf("d = %d\n", *((long *)0x0028FEB4));printf("e = %f\n", *((float *)0x0028FEB0)); // 从这里可以看出 &e 进行取地址,取出来的地址是有类型的printf("f = %f\n", *((double *)0x0028FEA8));// a = 1// b = 2// c = 3// d = 4// e = 1.200000// f = 2.300000return 0;}
