C語言面試必問知識點之「指針」
一、指針相關概念
- 指針與位址
- 我們使用的計算機,系統為了更好地管理我們的記憶體,就為記憶體區的每一個位元組都配置設定一個唯一編号,這就是“位址”。
- 指針的實質就是位址,就是這一個個編号。
-
指針變量
變量在編譯的時候系統要為它配置設定一個位址,如用另一個變量來存放這個位址,那麼這個變量就叫指向變量的指針變量。
- 指針的定義(type *變量名;)
- int *p;
- 表示該變量的類型是一個指針變量,指針變量名是p而不是*p
- 如果在同一行定義多個指針變量應該是:int *p1, *p2;而不是int *p1, p2
- 指針的初始化
type *變量名 = 位址;
- 例子
#include <stdio.h>
int main()
{
int a = 100;
printf("%d\n",&a);
int *c = &a;
printf("%d\n",c);
return 0;
}
二、指針變量的使用(如何通過指針變量通路和運算)
-
指針變量通路
定義一個指針變量,并且指向一個位址
int a = 10;
int *p = &a;
*p = 100;
printf("a:%d\n",a);
-
指針運算
定義一個指針變量,指向一個位址,并對指針做自增自操作
#include <stdio.h>
int main()
{
int a = 10;
int *p = &a;
printf("p:%d\n",p);
p++;
printf("p:%d\n",p);
return 0;
}
三、數組指針
-
數組指針
數組指針,見名知意就知道是數組的指針,也就是數組的位址,在定義指針變量時,*變量名一定要帶上(),不然就是定義指針數組
int main()
{
int array[5] = {1,2,3,4,5};
printf("%d\n",&array);
int (*p)[5] = &array;
printf("%d\n",p);
return 0;
}
四、指針數組
-
指針數組
指針數組,就是存放指針的數組,數組裡的元素都是指針,在定義指針數組時,不需要加上(),不然就是定義數組指針
int main()
{
int array[5] = {1,2,3,4,5};
int *p[5];
int i;
for(i=0;i<5;i++)
{
p[i] = &array[i];
printf("%d\n",p[i]);
}
for(i=0;i<5;i++)
{
printf("%d\n",*p[i]);
}
return 0;
}
五、字元串與指針
- 字元串的表示形式
-
數組形式:
char str[] = "I love xdclass"; //棧
-
字元指針形式:
char *str = "I love xdclass"; //文字常量區
- 字元指針形式
char *str = "I love xdclass";
因為常量不可修改,是以指針變量指向的字元串内容不可修改,即*str = "xdclass";這樣是錯誤的
- 修改指針變量的值
char *str2 = "I love the world";
str = str2;
- 例子
int main()
{
char string[] = "I love xdclass";
printf("%s\n",string);
char *str = "I love xdclass";
char *str2 = "I love the world";
str = str2;
printf("%s\n",str);
return 0;
}
六、怎麼使用指針函數
-
指針函數
函數傳回類型是指針,是以就指針函數
- 例子
#include <stdio.h>
// 買菜:
char* buy()
{
char *foods = "雞蛋";
printf("%s買好了\n",foods);
return foods;
}
// 洗菜
void wash(char *foods)
{
printf("把%s洗幹淨了\n",foods);
}
// 炒菜
void make(char *foods)
{
printf("把%s做好了\n",foods);
}
int main()
{
char *foods = buy();
wash(foods);
make(foods);
return 0;
}
七、怎麼使用函數指針
-
函數指針的定義
函數傳回值類型 (* 指針變量名) (函數參數清單);
int(*p)(int, int, double, float);
- 例子
int printfx(int x)
{
printf("%d\n",x);
return 0;
}
int main()
{
printfx(2);
int (*p)(int);
p = printfx;
p(3);
return 0;
}
八、 什麼是指向指針的指針
-
什麼是指向指針的指針?
如果一個指針變量存放的是另一個指針變量的位址,則稱這個變量為指向指針的指針變量或指向指針的指針
-
定義方式
資料類型 **變量名
- 例子
int main()
{
int a = 100;
int *p = &a;
int **pp = &p;
printf("a:%d\n",a);
printf("p:%d\n",*p);
printf("pp:%d\n",**pp);
return 0;
}
# Louis講師 #
- 手把手帶你走進指針的世界 -