什麼是空指標和野指標?
1、空指標:
不允許向NULL和非法地址進行複製記憶體;
2、野指標:
野指標一般有三種情況存在:
(1)、開始時未初始化指標;
(2)、開闢空間(
malloc
)後也釋放(
free
)了,但是最後沒對指標進行置空操作;
(3)、指標的操作超越了變數作用域。
如何用指標步長?
假設自定義一個數據型別,求型別中屬性中的偏移量。首先一定要先匯入這個標頭檔案,實現透過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修飾函式中的形參,作用能有效防止誤操作,也可以透過地址傳遞,節省空間的作用。
謹慎使用指標:
因為指標使用不當容易造成越界記憶體洩露等問題,如果指標疊加,它會不斷改變指標指向,釋放就會導致出錯,這種情況就需要利用臨時指標去指向那塊記憶體。最後要注意避免在同一塊記憶體中釋放多次,同時
不可以釋放野指標
!
注意:
一級指標和二級指標做函式引數時,其輸入輸出特性是什麼?
輸入特性:
在主調函式中分配記憶體,被調函式中使用;
輸出特性:在
被調函式中分配記憶體,主調函式中使用;
陣列本質上是一個指標嗎?
不管是一維還是二維等陣列本質不是一個指標,當然除了這兩種情況之外,對陣列名稱進行sizeof(),或取地址的操作來獲取指標步長得到整個陣列的長度;除了這兩個,都是指向陣列中首元素地址的指標。
指標常量和常量指標有什麼區別?
指標常量如 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;}
效果圖如下所示: