*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=20
printf("%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 = 0028FEA8
printf("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.300000
printf("a = %d\n", *((char *)0x0028FEBF)); // (char *)0x0028FEBF == &a
printf("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.300000
return 0;
}