我们都知道c语言的指针是c语言区别于其他语言最大的区别之一。
c语言的指针也是一种变量,用来保存内存地址。
这边给一个例子。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int a = 10;
char *p1 = 100; //分配4个字节的内存
char *****p2 = 100;
int *p3 = NULL;
p3 = &a;
printf("front a=%d\n", a);
*p3 = 20;//间接的修改a的值
printf("behind a=%d\n", a);
//*就像一把钥匙 通过一个地址(&a),修改a变量
{
int c = 0;
c = *p3; //c=20
//*p放在=左边 写内存
//*p放在=右边 读内存
printf("c=%d\n", c);
}
{
char *p4 = NULL;
p4 = (char *)malloc(100);
}
printf("a:%d,p1:%d,p2:%d\n", sizeof(a), sizeof(p1), sizeof(p2));
system("pause");
return 0;
}
打印结果如图所示, 从打印结果中我们可以以下几点:
1.通过指针指向的变量,可以通过*操作所指向的内存,继而改变所指向变量的值。这是当*p放在等号左边的时候的结果。
2.当*p放在等号右边的时候即是读取所指变量的内存。
3.无论是多少级的指针,指针的内存大小都是4个字节,这是在32位的编译器上,因为4个字节正好代表32位。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *getStr()
{
char *tmp = NULL;
tmp = "abcdefgf";
return tmp;
}
int main(int argc, char *argv[])
{
char *p = getStr();
printf("p:%s\n", p);
*(p + 2) = 'r';//保证所指的内存块能修改
system("pause");
return 0;
}
通过以上的代码可以分析出,指针所指向的内容必须是可修改,否则进行写内存的时候会出现内存错误。
扫描二维码关注公众号,回复:
14960036 查看本文章
这边做一下总结:
1.指针也是一种变量,占有内存空间,用来保存内存地址
2.*p操作内存
在指针声明时,*号表示所声明的变量为指针
在指针使用时,*号表示 操作 指针所指向的内存空间中的值
*p相当于通过地址(p变量的值)找到一块内存;然后操作内存
*p放在等号的左边赋值(给内存赋值)
*p放在等号的右边取值(从内存获取值)
3.指针变量和它指向的内存块是两个不同的概念
含义1 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容;p = p +1; //p++
含义2 给*p赋值*p='a'; 不会改变指针变量的值,只会改变所指的内存块的值
含义3 =左边*p 表示 给内存赋值, =右边*p 表示取值 含义不同
含义4 =左边char *p
含义5 保证所指的内存块能修改
4.指针是一种数据类型,是指它指向的内存空间的数据类型
含义1:指针步长(p++),根据所致内存空间的数据类型来确定
p++=è(unsigned char )p+sizeof(a);
结论:指针的步长,根据所指内存空间类型来定。