一天不見如隔三秋。(〜^∇^)〜
在上一次指針的內容上,我們説過了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;
}
拜拜~~