① c語言高級指針,請來位大俠解答.
a. struct p的首地址值(取決於電腦、程序等因素)
b. struct p
c. x
d. 指向a的地址(該值見問題a)的指針的地址(指針的指針 的地址)
e. 不合法
f. 不合法
g. a的地址
h~k. 不合法
l. x
m. struct p
② c語言指針的概念
指針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變數可以表示各種數據結構; 能很方便地使用數組和字元串; 並能象匯編語言一樣處理內存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。 學習指針是學習C語言中最重要的一環, 能否正確理解和使用指針是我們是否掌握C語言的一個標志。同時, 指針也是C語言中最為困難的一部分,在學習中除了要正確理解基本概念,還必須要多編程,上機調試。只要作到這些,指針也是不難掌握的。
指針的基本概念 在計算機中,所有的數據都是存放在存儲器中的。 一般把存儲器中的一個位元組稱為一個內存單元, 不同的數據類型所佔用的內存單元數不等,如整型量佔2個單元,字元量佔1個單元等, 在第二章中已有詳細的介紹。為了正確地訪問這些內存單元, 必須為每個內存單元編上號。 根據一個內存單元的編號即可准確地找到該內存單元。內存單元的編號也叫做地址。 既然根據內存單元的編號或地址就可以找到所需的內存單元,所以通常也把這個地址稱為指針。 內存單元的指針和內存單元的內容是兩個不同的概念。 可以用一個通俗的例子來說明它們之間的關系。我們到銀行去存取款時, 銀行工作人員將根據我們的帳號去找我們的存款單, 找到之後在存單上寫入存款、取款的金額。在這里,帳號就是存單的指針, 存款數是存單的內容。對於一個內存單元來說,單元的地址即為指針, 其中存放的數據才是該單元的內容。在C語言中, 允許用一個變數來存放指針,這種變數稱為指針變數。因此, 一個指針變數的值就是某個內存單元的地址或稱為某內存單元的指針。圖中,設有字元變數C,其內容為「K」(ASCII碼為十進制數 75),C佔用了011A號單元(地址用十六進數表示)。設有指針變數P,內容為011A, 這種情況我們稱為P指向變數C,或說P是指向變數C的指針。 嚴格地說,一個指針是一個地址, 是一個常量。而一個指針變數卻可以被賦予不同的指針值,是變。 但在常把指針變數簡稱為指針。為了避免混淆,我們中約定:「指針」是指地址, 是常量,「指針變數」是指取值為地址的變數。 定義指針的目的是為了通過指針去訪問內存單元。
既然指針變數的值是一個地址, 那麼這個地址不僅可以是變數的地址, 也可以是其它數據結構的地址。在一個指針變數中存放一
個數組或一個函數的首地址有何意義呢? 因為數組或函數都是連續存放的。通過訪問指針變數取得了數組或函數的首地址, 也就找到了該數組或函數。這樣一來, 凡是出現數組,函數的地方都可以用一個指針變數來表示, 只要該指針變數中賦予數組或函數的首地址即可。這樣做, 將會使程序的概念十分清楚,程序本身也精練,高效。在C語言中, 一種數據類型或數據結構往往都佔有一組連續的內存單元。 用「地址」這個概念並不能很好地描述一種數據類型或數據結構, 而「指針」雖然實際上也是一個地址,但它卻是一個數據結構的首地址, 它是「指向」一個數據結構的,因而概念更為清楚,表示更為明確。 這也是引入「指針」概念的一個重要原因。
③ 有關C語言指針的問題,超難,高手進!!!
整個函數的作用是-->在以listelement * listpointer為單向鏈表頭的單向鏈表中的最尾段動態申請一個listelement結構的空間來存放要求加進單向鏈表的int data數據.並返回該鏈表的頭指針....
以下是對程序代碼的詳細解釋...
listelement * AddItem (listelement * listpointer, int data) {
//listpointer指向需要執行加入數據的單向鏈表的指針.這個指針可以指向任一條數據結構為listelement的單向鏈表
//data指的是要加入單向鏈表的具體數據
listelement * lp = listpointer; //使lp指向即將進行鏈表編歷的頭指針,這句為關鍵語句!
if (listpointer != NULL) { //如果鏈單不止一個有效項...則...
while (listpointer -> link != NULL)
listpointer = (listelement *) listpointer -> link; //這兩名加起來為一個循環體! 其作用是編歷整個鏈表的項.並保證listpointer指向鏈表中的最後一項!邏輯規定鏈表中的最後一項的listpointer -> link為NULL 其中listpointer = (listelement *) listpointer -> link中的(listelement *)為強制數據類型轉換!目的是100%確保link為指向listelement結構的指針...這句話其實在正常的邏輯下是多餘的.除非link除了指向本鏈表的下一個數據項外,還有別的作用! 但這樣的可能性很少....
listpointer -> link = (struct listelement *) malloc (sizeof (listelement)); //動態申請一個listelement結構空間,並把申請到的首地址作為listpointer -> link! 由於前面的循環體的作用,使得listpointer -> link確保為鏈單中的最後一項...
listpointer = listpointer -> link; //使listpointer指向最後一項的實體,以便加入指定data數據項....看,這句listpointer = (listelement *) listpointer -> link是多麼的相似!?(其執行結果肯定是一樣的) 從這里可以看出,在前面循環體內的(listelement *)肯定是多餘的!!!
listpointer -> link = NULL; //使listpointer在邏輯上成為本鏈表的最尾部!
listpointer -> dataitem = data; //加入數據
return lp; //返回本鏈表的頭指針! 這和函數的第一句是對應的,是關鍵語句,絕不能少的!
}
else { //如果鏈表為空,也就是一個數據項都沒有的話,則動態申請一個,並把data數據加到裡面保存,然後使剛動態生成的listpointer為鏈表頭指針! (以下的語句作用是就如此,我不多說了)
listpointer = (struct listelement *) malloc (sizeof (listelement));
listpointer -> link = NULL;
listpointer -> dataitem = data;
return listpointer;
}
}
PS:在高級語言里,指針的強制類型轉換是經常用到的技巧!但由於各編譯器的不同,會造成很多意想不到的邏輯錯誤!!!(很多時候,你以為確實是按自己的意思轉換成指定的類型了,但實際上卻完全不是這么一回事! 並這個錯誤有時是很難很難檢測到底是為什麼的!!!) 指針,用好了天下無敵,用不好就是一滴老鼠屎搞臭一鍋湯!!! 這樣情況的應用,用匯編是最不容易出錯的!
PS:舉個在G++編譯器里一個容易誤解的指針例子...兩個不同的指針定義-->char *lp=new char[255]; 和 char lp[255];
里具體語句的lp[1]的含義到底有什麼樣的區別!? 這個例子,相信很多人都會覺得是一樣沒區別的(這是在C++標准里說明的)...但實際上,如果是在G++編譯器里的話.定義為char lp[255];中的lp[1]的意義就是以lp為頭指針的下一個單元!在這里,是我們常規並正確的理解! 但是,如果寶義成char *lp=new char[255];的話,則在G++編譯器里lp[1]無解(結果是隨機亂指一通)!!!雖然編譯時不會出錯,但結果肯定是錯誤的! 解決的方法超級郁悶.只能通過lp++來一步步定址!(而不能通過lp[n]的方式直接定址,當然如果還有效率高的方法,但這在邏輯上很容易讓人混亂,那就是先把lp[0]轉成DWORD類型再加上n之後再強制轉成相應的指針類型!)
④ c語言中指針強大的功能體現在哪裡
樓上說的對啊,用指針就是用來直接操縱內存的,動態申請空間就是其中一個應用。
下面還有幾種經典的用法:
1.指針變數作為函數參數,在函數中修改變數的值。這個不用指針很難實現(c++中有引用可以實現)
void swap(int * p1, int *p2)
{// 在函數中交換兩個變數的值
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tm;
}
2.
你如果想在函數中返回多個值,應該怎麼辦呢?
可以選擇從主調函數中向被調用函數傳入參數,等待返回結果。
舉例:
void func(int *pa, int *pb, int *pc)
{// 你向函數中傳入三個參數,可以得到三個返回值了。
……
}
3.指針的主要應用就是直接操縱內存,這樣可以減少復制數據的時間。
struct Student
{
char name[10];
BOOL sex;
int score[10];
}
void func(struct Student *pst)
{// 傳址,減少了數據復制的時間,
// 有時為了防止參數被修改,可以改為 struct Student const *pst
}
void func(struct Student stu)
{// 傳值,需要把實參的值復制到stu中,有時耗費大量時間
}
4。
此外,還有常用到的數組,其實就是對內存直接操縱。其他的應用如指針與多維數組,指向函數的指針等。
⑤ C語言高級指針解讀
類型為「返回值為int的函數指針」的指針數組,即這個數組的每一個元素都是一個指針,這個指針指向的值(*f[0] 這種情況)為一個返回值為int的函數指針。給你個常式把:
#include <stdio.h>
#include <stdlib.h>
int func1()
{
return 1;
}
int func2()
{
return 2;
}
int (*(*f[2]))();
int main()
{
f[0] = malloc(sizeof(int *));
f[1] = malloc(sizeof(int *));
*f[0] = func1;
*f[1] = func2;
printf("%d, %d\n", (*f[0])(), (*f[1])());
return 0;
}
⑥ C語言高級指針
可以。但更易出錯,因此不太建議使用……
⑦ C語言指針變數比較
首先要 分清, 是在 聲明中 還是在語句中。
聲明中,例如:
int a=1, b=2;
int *p, *q; // 聲明 *p 和 *q 是指針,用於指向 int 型數據。
p=&a; q=&b; //語句, p 和 q 是指針 指向的數據 的地址,p 指向 a, q 指向 b.
if ( p < q) printf("...."); // 語句, p 和 q 是 "地址", 地址大小的比較。即 &a,&b 的比較。
若是 if ( *p < *q) printf("...."); // 語句, *p 和 *q 是 "數值「 的比較,即 a,b 的比較,現在 a=1,b=2。
即,語句中 有星號的是 數值,沒星號的是地址。
你的2道題里,p,q 是 地址。是地址值的比較。
⑧ 關於C語言高級指針
ptr = &&succeed,是指向(指向succeed的指針)的指針。
後面go to *ptr。 *ptr 就是(指向succeed的指針)
ptr = &&failure。同理。
⑨ c語言指針
變數賦值 是得到副本,如
t=a;
a=b;
b=t;
指針 則是指向同一個內存地址
因而獲得內存裡面的內容
如後者