關於C語言字串指標的一點點總結

2021-08-20 04:47:49 字數 1472 閱讀 6408

一直在看指標的資料,今天實踐了一次字串指標的操作,做乙個簡單的總結。

**如下,:

char * x = "abcd"; //宣告乙個字元型別的指標x 指向乙個字串
需要特別注意的地方為:

1、指標型別為char ,指標的型別決定了這個指標指向資料的型別;

2、指標變數 x 自身是有變數位址的,也就是說 x 變數作為乙個變數,有自己的記憶體位址。

那麼,這裡的賦值語句可以理解為 指標變數x的記憶體位址上儲存了乙個字元型別的位址。

這個可以通過以下**得出結果:

printf("%p \n",x);

printf("%p \n",*x);

程式執行後,應該是輸出兩個不同的位址,乙個是x變數自身的位址,第二行是x變數指向(儲存)的位址;

3、字元型指標雖然指向了乙個字串的位址,但是其儲存的只是這個字串的開始位址,也就是字串 「abcd」 裡面首字母 "a" 這個字元的記憶體位址,並不能直接通過指標修改整個字串的資料,需要通過指標運算來讀取和修改每乙個字串內的元素,我就是犯了這個毛病,感嘆指令碼語言太方便了,**如下:

char * x = "abcd";

char * z = "1234";

*x = *z ; //不合法

*x = 3; //不合法

釋疑:

雙引號括起來的字串是字串字面量(string literal),是靜態物件(儲存在記憶體區域的文字常量區,是無法被修改的),因此從語義上來說,指標指向它之後字串內容自然不可修改。雖然不可被更改,但

它是左值(lvalue),用&取位址還是可行的(結果是位址常量)。在c中它的型別是char,不是常量(在c++中型別是char const,是常量)。修改字串字面量的字元從而改變字串字面量,結果是未定義(undefined)的,行為不可預料,應該避免使用。

如果要修改的話,只有用指標指向可以修改的字串,例如字元陣列。

要實現所說的功能,可以這樣:

char *p=malloc(sizeof("this is a program"));

strcpy(p,"this is a program");

代替第一行即可。

或者也可以用非ansi c的庫函式:

char *p=strdup("this is a program");

這樣,p指向的記憶體單元是可修改的堆空間。

tips: malloc 的記憶體 開闢在堆區,所以是可以被修改的,字元陣列的初始化,看似是字串常量,實際在記憶體中,這個陣列所指向的位址是這個字串常量的拷貝,而不是在字串常量的靜態區域中,所以字串陣列可以修改自身儲存的字串內容而指向字串常量的指標無法修改字串內容。

關於Lisp的一點點

以後寫的語言相關應該主要是ruby 也許還有少數的c 了,所以在這裡先記錄一點關於lisp的東西。首先是乙個小故事 在 ilc 2002 大會上前lisp大神,當今的python倡導者peter norvig,由於某些原因,做乙個類似於馬丁路德在梵蒂岡宣揚新教的主題演講,因為他在演講中大膽地聲稱py...

深度學習的一點點一點點知識

我們手裡有大量的x和y,求權重訓練的是權重資料樣本 xwy 身高0體重0 血型0.3 腳指頭0.8 一組x計算出對應的乙個y 計算過程是w 下面的就是最基礎的公式 我們已知資料是大量的x和y 希望通過 西塔 來獲得w 我們的學習才剛剛開始,首先需要理解的是與門 x1x2y0 0001 0100 11...

一點點積累的C語言(九)

今天就到指標了 指標是用來存放位址的。include intmain 結果是 a 10 and b 20 pointer 1 10 and pointer 2 20 也就是說在pointer 1中存放的是a的位址。在使用 pointer 1時呼叫了其中的位址指向的變數。對於引用指標變數 includ...