C語言這些常見指標及陣列等問題,有哪些是你給忘記了的?

什麼是空指標和野指標?

1、空指標:

不允許向NULL和非法地址進行複製記憶體;

2、野指標:

野指標一般有三種情況存在:

(1)、開始時未初始化指標;

(2)、開闢空間(

malloc

)後也釋放(

free

)了,但是最後沒對指標進行置空操作;

(3)、指標的操作超越了變數作用域。

C語言這些常見指標及陣列等問題,有哪些是你給忘記了的?

如何用指標步長?

假設自定義一個數據型別,求型別中屬性中的偏移量。首先一定要先匯入這個標頭檔案,實現透過offsetof( 結構體型別 ,屬性 )得到。程式碼如下所示:

#define _CRT_SECURE_NO_WARNINGS#include #include #include #include struct myFunc{ char i; // 0 - 3 int j; // 4 - 7 char arr[128]; // 8 - 135 int k; // 136 139};int main(){ struct myFunc m = { ‘C’,100,“helloworld”,20 }; printf(“%d\n”, offsetof(struct myFunc, k)); //m中的k屬性偏移量為136 printf(“%d\n”, m。k); // 20 /* 當然也可以透過下面方法取得屬性值,一般不常用,程式碼實現複雜且易出錯 *(int *)((char *)&m + offsetof(struct myFunc, k)); */ system(“pause”); return 0;}

如何對指標進行間接賦值?

指標間接賦值必須滿足:

普通變數和指標變數(或者一個實參一個形參)建立關係,透過 * 進行賦值。如下程式碼所示:

#define _CRT_SECURE_NO_WARNINGS#include #include #include void setval(int *b) { *b = 100;}void test() { int q = 30; setval(&q); printf(“%d\n”, q);}int main(){ test(); return 0;}

const有哪些使用場景?

一般可以加入const修飾函式中的形參,作用能有效防止誤操作,也可以透過地址傳遞,節省空間的作用。

C語言這些常見指標及陣列等問題,有哪些是你給忘記了的?

謹慎使用指標:

因為指標使用不當容易造成越界記憶體洩露等問題,如果指標疊加,它會不斷改變指標指向,釋放就會導致出錯,這種情況就需要利用臨時指標去指向那塊記憶體。最後要注意避免在同一塊記憶體中釋放多次,同時

不可以釋放野指標

注意:

一級指標和二級指標做函式引數時,其輸入輸出特性是什麼?

輸入特性:

在主調函式中分配記憶體,被調函式中使用;

輸出特性:在

被調函式中分配記憶體,主調函式中使用;

陣列本質上是一個指標嗎?

不管是一維還是二維等陣列本質不是一個指標,當然除了這兩種情況之外,對陣列名稱進行sizeof(),或取地址的操作來獲取指標步長得到整個陣列的長度;除了這兩個,都是指向陣列中首元素地址的指標。

C語言這些常見指標及陣列等問題,有哪些是你給忘記了的?

指標常量和常量指標有什麼區別?

指標常量如 char * const c,指標的指向不可以被修改;

常量指標如 const char * c,指標的指向的值不可以被修改,指標指向可以被修改。

如何理解陣列指標和指標陣列?

1、所謂陣列指標就是一個指向陣列的指標,如 char (*a)[100];

2、指標陣列就是陣列中的每個元素都是指標的型別,是一個存放指標的陣列如 char * a[100];

下面用指標陣列用程式碼演示一下指標陣列的用法,對指標陣列利用選擇排序的方法進行從小到大排序,如下所示:

#define _CRT_SECURE_NO_WARNINGS#include #include #include // 利用選擇排序void selectSort(char *buf[], int len){ for (int x = 0; x< len; x++) { // 設x為最大值下標 int max = x; for (int i = x + 1; i < len; i++) { if (strcmp(buf[max], buf[i]) == 1) { max = i; } } if (x != max) { char* temp = buf[x]; buf[x] = buf[max]; buf[max] = temp; } }}void getArray(char * buf[], int len){ for (int i = 0; i < len; i++) { printf(“%s ”,buf[i]); } printf(“\n”);}void test(){ // 從小到大排序 char * buf[] = { “ggg”,“ddd”,“qqq”,“hhh”,“eee” }; int len = sizeof(buf) / sizeof(buf[0]); selectSort(buf, len); getArray(buf, len);}int main(){ test(); // 結果為:ddd eee ggg hhh qqq return 0;}

效果圖如下所示:

C語言這些常見指標及陣列等問題,有哪些是你給忘記了的?