指针一

指针

在我的理解中,指针是用来存放地址的。指针也有大小,对于不同类型的指针char,short,int,,,double,它们的指针大小都是8个字节,对于64位机器是这样的,而对于32位机器它们的指针大小都为4个字节。我的是64位操作系统:

#include <stdio.h>

int main()
{
	printf("%zd\n", sizeof(char*));
	printf("%zd\n", sizeof(short*));
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(long*));
	printf("%zd\n", sizeof(float*));
	printf("%zd\n", sizeof(double*));

	return 0;
}

image
显而易见都是8个字节大小的指针。

#include <stdio.h>

int main()
{
	int a = 10;
	int* p = &a;
	printf("%p\n", p);
	
	return 0;
}

分析以上代码:我们定义并初始化了一个int类型的整型变量a,它的值是10;那么此时内存就会给a分配一个int类型大小的空间用来存放a变量,那么也就是说在内存中有一个内存地址专门来指向a。我们想拿到变量a的地址就要用一个操作符,叫做取地址符&,通过&a我们就拿到了a的内存地址,当然我们拿到了a的内存地址就要那个变量把它存起来,所以我们用变量p把它存起来,而p的类型是一个指针*,而int表示p所指向的对象的类型是int类型。我们把p的值打印出来:
image
我们通常用16进制来存储地址。



那我们有了指针变量p如何改变变量a里的值呢,此时我们也要用到一个操作符叫做解引用符**p就等价于a,所以我们加入*p = 20;代码后原来a的值就会被重新赋值为20。

#include <stdio.h>

int main()
{
	int a = 10;
	int* p = &a;
	*p = 20;
	printf("%d\n", a);

	return 0;
}

image

const

在定义变量前加const表示该变量是一个伪常量,你不能直接修改例如:

#include <stdio.h>

int main()
{
	const int a = 10;
	a = 20;
	printf("%d\n", a);

	return 0;
}

image
编译不通过。但你可以通过指针来间接去修改它的值:

#include <stdio.h>

int main()
{0
	const int a = 10;
	int* p = &a;
	*p = 20;
	printf("%d\n", a);

	return 0;
}

image
对于代码int* p = &a;,加入的const位置不同那么它的作用也不同,例如const int* p = &a;或int const * p = &a表示我们不能修改指针变量p所指向的那块内存空间里存的值。而int* const p = %a;,表示我们不能修改指针变量p存储的内存地址的值

多重指针

#include <stdio.h>

int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
	int*** ppp=&pp;

	return 0;
}

里面最多有一个三重指针,你每取一次地址就会加一重指针。

#include <stdio.h>

int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
	int*** ppp=&pp;

	printf("%d\n", ***ppp==a);
	printf("%d\n", **pp==a);
	printf("%d\n", *p==a);

	printf("%d\n",*ppp==&p);
	printf("%d\n",*pp==&a);

	return 0;
}

image
printf中的等式两边都是等价的。

指针的加减

#include <stdio.h>

int main()
{
	int arr[2] = {0};
	int* p1 = &arr[0];
	int* p2 = &arr[1];

	printf("p2-p1=%zd\n", p2-p1);

	return 0;
}

指针减指针的结果是它们之间差的元素个数
image
而指针加1的结果就要根据指针的类型

#include <stdio.h>

int main()
{
	int arr[2] = {0};
	int* p1 = &arr[0];
	int* p2 = &arr[1];

	printf("p1=%p\n", p1);
	printf("p1+1=%p\n", p1+1);

	return 0;
}

image
显而易见它们之间差了4个字节也就是一个int类型的大小。而对于char类型加1,它们之间相差为1也就是一个char类型的大小。

#include <stdio.h>

int main()
{
	char arr[6] = "hello";
	char* p1 = &arr[0];
	char* p2 = &arr[1];

	printf("p1=%p\n", p1);
	printf("p1+1=%p\n", p1+1);

	return 0;
}

image

posted @ 2023-07-13 22:00  若达萨罗  阅读(56)  评论(0)    收藏  举报