天天看點

指針搞都不懂,好意思說自己會C語言?

指針搞都不懂,好意思說自己會C語言?
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;
}      
指針搞都不懂,好意思說自己會C語言?
指針搞都不懂,好意思說自己會C語言?
指針搞都不懂,好意思說自己會C語言?

# Louis講師 #

- 手把手帶你走進指針的世界 -