一天不见如隔三秋。(〜^∇^)〜
在上一次指针的内容上,我们说过了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;
}
我们可以发现a的值被我们修改(づ ̄ ³ ̄)づ
可是如果我们不想让a被通过地址修改,那我又应该如何做呢?⚆ᗝ⚆
const不仅仅修饰变量,还可以修饰指针的变量我使用如下代码。
int main()
{
int a = 10;
const int* pa = &a;
*pa = 20; //*pa报错了
printf("%d\n", a);
return 0;
}
我们发现当我们想要去使用这些解引用操作符,去修改我们的值我们的编译器会报错,但是我们能否直接修改呢?
然后我们又看到了新的代码,我们发现下面的这样一串代码和上面的这样串代码const位置不一样。那他们的效果是一样的吗?
#include<stdio.h>
int main()
{
int a = 10;
int*const pa = &a;
*pa = 20;
printf("%d\n", a);
return 0;
}
我们发现他们的效果完全不同。虽然都是在同一行,位置的不同造就了他们效果的不同。
所以对于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;
}
const放在*的左边,限制是*pa,意思是不能通过指针变量pa修改a指向的空间的内容
但是a是不受限制的
2,const放到*后面
int main()
{
int a = 10;
int * const pa = &a;
*pa = 20;
printf("%d\n", a);
return 0;
}
#include<stdio.h>
int main()
{
int a = 10;
int * const pa = &a;
pa = 20;
printf("%d\n", a);
return 0;
}
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;
}
#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<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;
}
#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;
}
指针减指针
他会计算出什么?我们发现当我们使用指针减指针我能得到的九,那这个数是怎么来的呢?
这是我上次做的图ゞ◎Д◎ヾ,在我这里的图片可以看到。指针与指针相减,其实那就是地址减地址,得到的是一个地址的范围。
我们可以做个比较,就像我们这样计算题一样,就像下面这样的图。
我们拿B点减去A点,我们得到的是a点和b点之间的距离,这就像指针减去指针,得到的地址一样。⊙△⊙我们通俗来讲指针减去指针得到的就是指针之间的元素。
于是我们模拟实现strlen
#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;
}
拜拜~~