c语言之指针讲解

我们都知道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;
}

 通过以上的代码可以分析出,指针所指向的内容必须是可修改,否则进行写内存的时候会出现内存错误。

这边做一下总结:

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);

结论:指针的步长,根据所指内存空间类型来定。

猜你喜欢

转载自blog.csdn.net/qq_45526401/article/details/127355315