C指標 的一些練習

2022-02-06 20:27:53 字數 3804 閱讀 5850

注:此篇是我使用指標敲的一些題目的整合,有一些**是重複的(撓頭)。這樣做的目的是進行前後的一些比較和收穫一些心得(?)。

題目:輸入十個整數,進行排序。

做法1:(傳遞指標p)

#include #include #include using namespace std;

void swap(int *p)

} }for(i = 1; i <= 10; i++)

printf("\n");

}int main()

swap(p);

return 0;

}

做法2:(傳遞陣列名)

#include #include #include using namespace std;

void swap(int a)

} }for(i = 1; i <= 10; i++)

printf("\n");

}int main()

swap(a);

return 0;

}

有段時間沒敲鍊錶了(撓頭),重新實現下,發現還是很多地方出錯了:(

經過漫長時間的debug,發現乙個原因是,在主函式裡面定義的整形變數,在函式pdelete裡面缺少了對其的定義,編譯居然過了(撓頭)

寫了兩遍。貼個最後一次實現的**吧。

鍊錶的建立,輸出,插入和刪除

#include #include #include using namespace std;

struct node

;void ininode(node *head)

head -> next = null;

head -> data = -1;

}node *creat()

p1 = (node *)malloc(sizeof(node));

if(p1 == null)

p1 -> data = a;

p2 -> next = p1;

p2 = p1; }

return head;

}void output(node *head)

printf("\n");

}void pinsert(node *head)

node *p;

p = (node *)malloc(sizeof(node));

if(p == null)

p -> next = p1;

p -> data = i_data;

p2 -> next = p;

output(head);

}void pdelete(node *head)

p1 = p1 -> next;

free(p2 -> next); // 勿忘我

p2 -> next = p1;

output(head);

}int main()

void ininode(node *head)

head -> next = null;

head -> data = -1;

}node *creat()

p1 = (node *)malloc(sizeof(node));

if(p1 == null)

p1 -> data = a;

p2 -> next = p1;

p2 = p1; }

return head;

}

**1. **在creat裡面,初始化node的時候不能置null:

node *head = null; // error.

ininode(head);

**2. **其次,在構建鍊錶的時候,需要注意p2 始終跟在 p1的後面,起到link的作用。

p1 = (node *)malloc(sizeof(node));

···p1 -> data = a;

p2 -> next = p1; // 這句話不要忘記

p2 = p1;

**3. **while迴圈條件,我的寫法是剛剛開始時將p1 和p2 ,指向頭節點。所以迴圈條件得:

while(p1 -> next != null || p1 == head)
否則,開始時p1 -> next == null就沒有辦法進入迴圈進行輸入。

void output(node *head)

printf("\n");

}

注意:按照我的寫法,開始賦值的時候,需要置p為head -> next,否則無法進入迴圈。

void pinsert(node *head)

node *p;

p = (node *)malloc(sizeof(node));

if(p == null)

p -> next = p1;

p -> data = i_data;

p2 -> next = p;

output(head);

}

**1. **for迴圈條件需要根據p1 和 p2的初始指向確定。

p1 = p2 = head;

···for(i = 1; i <= num; i++) // <=

否則會導致崩潰,指向錯誤。

**2. **創立的新結點 同樣需要malloc語句

node *p;

p = (node *)malloc(sizeof(node));

if(p == null)

void pdelete(node *head)

p1 = p1 -> next;

free(p2 -> next); // 勿忘我

p2 -> next = p1;

output(head);

}

注:和insert一樣,需要根據p1 和p2 的初始指向確定迴圈範圍。

void pfree(node *head)

if(p1 == head)

free(p1);

}

c指標的一些理解

c語言所有複雜的指標宣告,都是由各種宣告巢狀構成的。如何解讀複雜指標宣告呢?右左法則是乙個既著名又常用的方法。不過,右左法則其實並不是c標準裡面的內容,它是從c標準的宣告規定中歸納出來的方法。c標準的宣告規則,是用來解決如何建立宣告的,而右左法則是用來解決如何辯識乙個宣告的,兩者可以說是相反的。右左...

關於C指標的一些理解

有時總被指標的用法及型別所困擾,那我簡單理解一下指標。指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。如下例子 1 int ptr 2 cha...

C 使用指標的一些情境

關於指標的基本概念網路上有很多,這裡列的是一些細節,加深理解。為正在學習c c 的人提供。一 指標概念的核心 指標 儲存的是另乙個物件的位址。string s hello world string p s 指標 p 指向的是 string 型別的物件 s,即指標 p 儲存 s 的位址 瞎寫 0xss...