一天不见如隔三秋。(〜^∇^)〜

在上一次指针的内容上,我们说过了void类型的知识,到那也就结束了。不用void的指针的,大多都会运用于函数上面。


接下来的内容依旧与指针有关。

1,const修饰

那么我们看一下面的代码

int main()
{
	const int a = 10;
	a = 20;           //a报错
}


int main()
{
	 int a = 10;
	a = 20;         //a没报错
}



小白指针(二)----新手_关系运算


我们发现a不能被修改了,为什么呢?这是因为在C语言中,当我们的变量被const修饰的时候,就有常变量属性。其他本身是个变量,但又不能被修改。

我们知道数组括号里面放的是常量,当我们使用被修饰的变量放到数组的括号里。我们的编译器会报错,这就证明了他是个变量,但是。我们不能修改他,它又具有常量的属性。ヾ(´▽`;)ゝ


这是const修饰变量,那我们怎么去修改变量的值呢?这时候就可以用到地址,我们通过去找他的空间,去修改他的值并非直接修改

像下面这样。



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

	return 0;
}

小白指针(二)----新手_数组_02



我们可以发现a的值被我们修改(づ ̄ ³ ̄)づ

可是如果我们不想让a被通过地址修改,那我又应该如何做呢?⚆ᗝ⚆

const不仅仅修饰变量,还可以修饰指针的变量我使用如下代码。


int main()
{
	 int a = 10;
	const int* pa = &a;
	*pa = 20;                   //*pa报错了
	printf("%d\n", a);

	return 0;
}



小白指针(二)----新手_#include_03


我们发现当我们想要去使用这些解引用操作符,去修改我们的值我们的编译器会报错,但是我们能否直接修改呢?

小白指针(二)----新手_数组_04






然后我们又看到了新的代码,我们发现下面的这样一串代码和上面的这样串代码const位置不一样。那他们的效果是一样的吗?



#include<stdio.h>

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

	return 0;
}


小白指针(二)----新手_模拟实现strlen_05



我们发现他们的效果完全不同。虽然都是在同一行,位置的不同造就了他们效果的不同。

所以对于const我们有两种性质。

1,const放到*前面

int main()
{
	 int a = 10;
	const int*  pa = &a;
	*pa = 20;                    //不能使用*pa修改
	printf("%d\n", a);

	return 0;
}


#include<stdio.h>

int main()
{
	 int a = 10;
	const int*  pa = &a;
	a = 20;                 //可以使用a去修改
	printf("%d\n", a);

	return 0;
}


小白指针(二)----新手_模拟实现strlen_06


const放在*的左边,限制是*pa,意思是不能通过指针变量pa修改a指向的空间的内容

但是a是不受限制的


2,const放到*后面

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

	return 0;
}


小白指针(二)----新手_模拟实现strlen_07

#include<stdio.h>

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

	return 0;
}


小白指针(二)----新手_关系运算_08

const 放在*的右边,限制是pa变量,也就是a变量不能被pa修改了,没办法再指向其他变量了

但是*pa不受限制,还是可以通过pa来修改a所指向的对象的

p

3,指针运算

指针运算,包括指针加减整数,指针减指针,指针的关系运算。

指针的加减整数其实我们在一的时候已经讲过了,这里稍微提一下比如说我们用下面这样的代码,可以通过指针去打印数组内所有的元素。以下两种写法都一样(^_−)☆

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", *p);
			p++;
	}
	return 0;
}


小白指针(二)----新手_模拟实现strlen_09

#include<stdio.h>

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", *(p + i));
	}
	return 0;
}

小白指针(二)----新手_#include_10



当我们了解了指针的时候,我们是否有个想法?指针能否进行运算的。我看下面这样的代码

#include<stdio.h>

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

	printf("%d\n", &arr[9] - &arr[0]);

	return 0;
}

小白指针(二)----新手_模拟实现strlen_11


#include<stdio.h>

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

	printf("%d\n", &arr[0] - &arr[9]);

	return 0;
}


小白指针(二)----新手_数组_12

指针减指针

他会计算出什么?我们发现当我们使用指针减指针我能得到的九,那这个数是怎么来的呢?




这是我上次做的图ゞ◎Д◎ヾ,在我这里的图片可以看到。指针与指针相减,其实那就是地址减地址,得到的是一个地址的范围。

我们可以做个比较,就像我们这样计算题一样,就像下面这样的图。


小白指针(二)----新手_数组_13



我们拿B点减去A点,我们得到的是a点和b点之间的距离,这就像指针减去指针,得到的地址一样。⊙△⊙我们通俗来讲指针减去指针得到的就是指针之间的元素。


于是我们模拟实现strlen

小白指针(二)----新手_数组_14

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int my_strlen(char* s)
{
	int count = 0;
	while (*s != '\0')
	{
		count++;
		s++;


	}
	return count;
}


int main()
{
	int len = my_strlen("asdfg");

	printf("%d\n", len);

	return 0;
}


#include<stdio.h>
int my_strlen(char* s)
{
	char * start=s;
	while (*s != '\0')
	{
		s++;
	}
	return s-start;
}


int main()
{
	int len = my_strlen("asdfg");

	printf("%d\n", len);

	return 0;
}

3.3指针的关系运算

#include <stdio.h>
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 int *p = &arr[0];
 int i = 0;
 int sz = sizeof(arr)/sizeof(arr[0]);
 while(p<arr+sz) //指针的⼤⼩⽐较
 {
 printf("%d ", *p);
 p++;
 }
 return 0;
}

拜拜~~