C語言 指標 指標 陣列 字串

2021-10-08 22:45:10 字數 3814 閱讀 2643

位址

在c語言中定義的每乙個變數都擁有屬於自己的儲存單元的位址,

通常我們認為乙個變數擁有兩個值,乙個左值(位址)乙個右值(變數的值)

在scanf()中使用到的 取位址符(&),就是向這個位址中輸入資料從而給變數賦值

訪問位址 就需要用到指標,用於儲存位址

對於物件的訪問

1.直接訪問:通過物件名去實現訪問,但有作用域的限制
指標

用於儲存其他物件的位址值。

在32位的系統中佔4個位元組,64位的佔8個位元組

1)指標的定義

指標變數的定義和其他變數的相同也是: 變數的型別 變數名= 初始值

int * p = null; 指標

這裡表示定義了乙個int * 型別指標p;他初始化直向空(空指標),

還有一種定義: int * p ; 這種定義,沒有賦初始值,他是乙個(野指標)指向未知,不知道是否能訪問,能否修改。通常我們都是先定義空指標。在給他賦值。

在1中定義p 需要賦值(或者申請空間malloc),才能實現他的作用

賦值 int a = 5;

p = &a; //此時將a的位址付給了p,也可以說是p指向了a。

此時 *p == 5;

兩個符號可以約掉 *&p == p 但是&*不能

3)指標變數作為函式的引數

形參 = 實參的值,

指標傳入的是位址值,形參和實參指向的是同乙個位址,改變形參的值同時會時實參的值發生變化。

在實現交換兩個數的值時,傳入位址,改變位址對應的值,可以實現交換,,但是注意的是,有題目是交換了傳入的位址,也就是兩個形參的位址做了交換,這樣並不能交換實參的值。

4)陣列與指標

陣列元素是和普通元素是一樣的,陣列元素也有它自己的位址。

陣列元素也有左值和右值,只不過陣列的每乙個元素的位址是相鄰。

陣列名 可以代表首元素的位址。

int a[10];

a => &a[0],陣列名a當作指標來看。

指標加減,看當前的指向,如一維陣列的p=>a =》a[0] p+1 =>a[1];

5)指標常量和常量指標

指標常量: 指標本身不能改變的,但是指向的空間裡面

的內容可變。

如: 陣列名 int * const a;

常量指標:是指向常量的指標。

指向的物件是常量,那麼這個物件不能夠改變的。

指標本身可以被改變,但是指向的空間的內容不能改變。

const int * a;

int const * a;

6)陣列名和指標

陣列名是乙個指標常量。

陣列名可以代表整個陣列,但有些情況下是當作指標來看的。

如陣列 : int a[10];

a <=> &a[0];

a代表的是a[0]的位址 a+1代表的是a[1]的位址。

此處的+1移動的是多長需要看當前a代表的是什麼來決定。

如 : int a[3][4];

此時 a 代表的就是&a[0] a+1 =&a[1] 看成3行4列,可以理解為。首先指向的是第0行,加1 ,指向的是第1行,其位址在數值上等於他們那一行的第乙個元素的位址。

如:一維陣列

int a[5] = ;

int * ptr = (int *)(&a + 1); //此時ptr指向了a陣列後面的空間

printf("%d %d\n", *(a + 1), *(ptr - 1)); // 2 5

如:二維陣列

*(a[1] + 2) 此時 a[1] 應該當作指標來看

*(&a[1][0] + 2)

=> *(&a[1][2])

=> a[1][2] //!!!!表示第1行第2列的那個元素 (不要寫代表值)

練習題:

**a[3][4] 寫出表示式的含義 **

&a[1][0]: 第1行第0列的元素的位址

a[2]: (1)代表a[2]這乙個陣列 (2)代表第2行第0列元素的位址

&a[0] + 1: =》 &a[1] (1)第一行的位址

*(&a[1][0] + 1): 代表第1行第1列的那個元素

7)指標陣列 與 陣列指標

a)指標陣列:

指標陣列是乙個陣列,不過陣列中存放的全是指標

定義如:int(任意型別都可以) * p[10]; 相當於乙個陣列裡面存放了10個int * 型別的資料

b)陣列指標:

陣列指標是乙個指標,用於指向乙個陣列

定義: int (*p)[10]; 指向乙個有10個元素的陣列 <=> int a[10];

8) 字串與指標

字串就是又一串字元組成 (string型別????c語言中好像還沒涉及到這個型別)

字串的表達方式有兩種

a)字元陣列

char a [6] = ;

b)字元指標

char * p = "abcd"

字串末尾會預設為"\0" 表示字串結束

字串我們只需要儲存他的首位址即可,讀取時會一直讀到0結束

在c語言裡面字串是儲存在乙個叫做 .rodata(唯讀資料)的記憶體區域。

唯讀區域無法修改

char * p = "123456";

此時執行 *(p+1)=『a』; 會出現段錯誤,因為此區域的資料是無法修改的。

字元陣列

char a [6] = ;

//與普通的陣列相同,儲存在乙個.data/棧空間,陣列區域資料是可讀可寫的

同時大小也是與陣列相同

sizeof(a)=6;

注意!!!使用sizeof時

char s = ;// 這種末尾沒有0

sizeof(s) = 5

char s = ; //這種末尾會新增0

=> char s = ;

sizeof(s) = 6

《strlen 計算的值不包括0》

9) 字串常用函式

(1) strlen: 用來求乙個字串的長度

標頭檔案: #include 計算字串的長度,不包含'\0'

l = strlen("abcd\nabc"); == 8 // \n看成乙個?? \大多數都是表示轉義

l = strlen("123\0123abc\0abc"); == 8 //讀到0結束,但是第乙個\0並不是末尾,

我們碰到這樣的需要判斷他是否為8進製的樹,此時\012是當成8進製來看的。

\*** 可接乙個、兩個或三個八進位制的數

(2)strcpy/strncpy 字串拷貝

標頭檔案: #include strcpy(char *dest, const char *src);

複製 乙個字串到另乙個字串,都是從頭開始

strcpy(沒有考慮越界)strncpy增加了長度限制,

(1) 遇到\0拷貝結束,此時\0也會被拷貝

(2) 已經拷貝n個字元了(後面的\0不會自動拷貝,除非第n字元為\0)

(3)strcmp/strncmp

字串比較,同樣strcmpy是全部比較,strncmp是限制比較的長度

字串比較是乙個乙個字元比較,

如果 c1>c2 返回 1,如果c1如果相同則繼續比較到下乙個字元,知道結束,返回0

(4)strcat / strncat

源字串空間應該足夠大。將字串鏈結到尾部。

同樣 拷貝到\0結束,strncpy限制大小

C 字元 字串 字元陣列 字串指標 指標陣列

一 c 字元 字串 字元陣列 字串指標 指標陣列 前言 一 字元指標 字元陣列 二 字串指標 三 字串 指標陣列 四 常用方法 參考為了深入理解c 並時常回顧學過的知識點,對c 知識點進行記錄總結。參考1字元指標的儲存方式 字元指標變數本身是乙個變數,用於存放字元 字串的首位址。字串本身是存放在以該...

C語言指標 字串和指標

字元指標可以指向字元變數,但在實際應用中,我們常常會用到字串,而字串也是可以用字元指標指向的,但根據字串的不同儲存方式主要分為字串常量和利用字元陣列儲存的字串變數,兩者有不同的定義和使用形式 字元指標可以用來儲存字串常量的首位址 例如 char ptr my name is 此時,字串常量在記憶體中...

指標陣列,陣列指標,字串與指標

在研究指標陣列與陣列指標的時候,遇到了這個困惑,後面解答。void test02 char c 4 char p2 4 指標陣列 for int j 0 j 4 j for int i 0 i 4 i 指標陣列是陣列,即乙個陣列中,每個元素都是指標 void test05 注意這一行和最後一行的區別...