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

在上一次指針的內容上,我們説過了void類型的知識,到那也就結束了。不用void的指針的,大多都會運用於函數上面。

接下來的內容依舊與指針有關。

1,const修飾

那麼我們看一下面的代碼

int main()
{
const int a = 10;
a = 20; //a
報錯
}
int main()
{
int a = 10;
a = 20; //a
沒報錯
}

小白指針(二)----新手_#include

我們發現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;
}

小白指針(二)----新手_關係運算_03

我們發現當我們想要去使用這些解引用操作符,去修改我們的值我們的編譯器會報錯,但是我們能否直接修改呢?

小白指針(二)----新手_數組_04

然後我們又看到了新的代碼,我們發現下面的這樣一串代碼和上面的這樣串代碼const位置不一樣。那他們的效果是一樣的嗎?

#include<stdio.h>
int main()
{
int a = 10;
int*const pa = &a;
*pa = 20;
printf("%d\n", a);
return 0;
}

小白指針(二)----新手_數組_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;
}

小白指針(二)----新手_#include_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;
}

小白指針(二)----新手_關係運算_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;
}

小白指針(二)----新手_數組_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;
}

小白指針(二)----新手_關係運算_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;
}

拜拜~~