11、指针基础

本章将是我学习c语言的最后一章,接下来将进入java的学习,祝大家奔流不息


一、指针的理解

CPU处理数据时会从内存中读取后再放回

而内存的空间是由一个个一字节大小的空间组成的(房间),我们把房间的门牌号就称作指针

11、指针基础_第1张图片

1、取地址符号

顾名思义就是把存放变量的地址取出来

int main()
{
	int a = 0;
	printf("%p", &a);

	return 0;
}

在这里整形变量占四个字节,&只会取出最低位字节的地址

2、解引用操作符(*)

假如我们取出地址后想要存放起来,就需要一个指针变量

这里的int代表的时后面变量的类型,而’*‘是为了声明p是个指针变量

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

	return 0;
}

这里的*p就相当于就是a的值,间接利用*p改变了a的值而又不用直接改变a

3、指针变量类型的意义

(1)  解引用方面的意义:

指针变量的大小和类型无关,只要是指针变量,在同⼀个平台下,大小都是⼀样的,那指针变量的类型有什么意义呢?

11、指针基础_第2张图片

刚才的解引用就可以派上用场了:

11、指针基础_第3张图片

11、指针基础_第4张图片

是不是可以清晰的看到不同类型改变内存里同一地址字节的数量不同

(2)、在精确访问上的意义:

int main()
{
	int a = 10;
	int* p = &a;
	char* b = &a;
	printf("%p\n", p    );
	printf("%p\n", p + 1);

	printf("%p\n", b    );
	printf("%p\n", b + 1);
	return 0;
}

这是运行结果:

0000002247CFF6B4
0000002247CFF6B8
0000002247CFF6B4
0000002247CFF6B5

是不是很明了

另外有个特殊的需要稍微注意一下:

void*  这个类型可以存放各种类型的变量,但是它就不能进行上面的操作,因为不知道类型而无法知道具体操作几个字节

二、指针运算

1. 指针 + 整数

来看一个案例:基本的打印数组的方法

int main()
{
	int i = 0;
	int arr1[5] = { 1, 2, 3, 4, 5 };
	int a = sizeof(arr1) / sizeof(arr1[0]);
	for (i = 0;i < a;i++)
	{
		printf("%d ", arr1[i]);
	}

	return 0;
}

来看看属于指针的版本:

int main()
{
	int i = 0;
	int arr1[5] = { 1, 2, 3, 4, 5 };
	
	/*拿到第一个元素的地址*/
	int* p = &arr1[0];

	while(i < 5)
	{
		printf("%d ", *p + i);
		i++;
	}

	return 0;
}

这里的打印就很好的利用了解引用这一手段

2. 指针 - 整数

前提:两个指针指向了同一块空间,否则不能相减

指针-指针的绝对值,就是元素之间的个数:

int main()
{
	int arr[5] = { 1, 2, 3, 4, 5 };
	printf("%lld\n", &arr[4] - &arr[0]);
	printf("%lld\n", &arr[0] - &arr[4]);
	return 0;
}
4
-4

还有个更好的例子:用函数求字符串的长度

int my_strlen(char* s)
{
	/*这里取的就是字符串的首地址*/
	char* p = s;

	while (*p != '\0')
		p++;

	/*这里返回的就是末地址减首地址*/
	return p - s;
}
int main()
{
	printf("%d\n", my_strlen("abc"));

	return 0;
}

3. 指针的关系运算

int main()
 {
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 int *p = &arr[0];
 int sz = sizeof(arr)/sizeof(arr[0]);

 指针的⼤⼩⽐较
 while(p < arr + sz) 

 {
 printf("%d ", *p);
 p++;
 }
 return 0;
 }

这个主要就是利用了数组的边界,过了边界再访问就访问不到了

三、const

const会将指向对象锁死,让其无法被修改

int main()
{
	int m = 0;
	int n = 0;

	m = 20;
	/*是可以修改的*/
	const int n = 0;
	n = 20;
	/*是不能被修改的*/
	return 0;
}

如果在这里非要修改可以使用指针变量和解引用的手段:

int main()
{
	const int n = 0;

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

	return 0;
}

很简单,就不多解释了

另外const也可以放在别的位置

假如这样:

const int* p = &n;                 (*p不能被改变)

int * const p = &n;              (p不能被改变)

int const * const p = &n; (*p和p都不能被改变)

好的,本章到这里就到此为止了~  

11、指针基础_第5张图片

让我们在java的学习道路上再见


你可能感兴趣的:(11、指针基础)