【C語言進(jìn)階】二、指針-創(chuàng)新互聯(lián)

一、指針數(shù)組

我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、同安ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的同安網(wǎng)站制作公司

存放指針的數(shù)組

int* arr[10];

二、數(shù)組指針

指向數(shù)組的指針

? int (*p)[10]? ? ? 其中p是數(shù)組指針的名字

? int (*) [10]? ? ? ?這個(gè)是類型(&arr 取出的類型)

三、數(shù)組參數(shù)和指針參數(shù)

一維數(shù)組傳參,直接使用指針接收

void test(int *arr)

二維數(shù)組的傳參,

void test(int arr[3][5]);

void test(int arr[][5]);//行可以省略,列不可以省略,但是不可以都省略

? void test(int (*p)[5]);//形參寫成指針的形式

注:

? 當(dāng)函數(shù)的形參是二級(jí)指針時(shí),不可以只把二維數(shù)組的數(shù)組名傳入函數(shù),因?yàn)槎S數(shù)組的數(shù)組名是第一行的地址,需要用數(shù)組指針來接收。

四、函數(shù)指針

函數(shù)指針存儲(chǔ)的是函數(shù)的地址,其中,例如,函數(shù)名是Add? ,&Add? 與? Add? 意義一樣;

int Add (int x,int y)

{

? return x+y;

}

此函數(shù)的地址表達(dá)方式是:? int? (*pf)(int , int)=Add;? ?pf? 就是函數(shù)指針變量。

注:

? a、int ret = (*pf) (2,3); 和 int ret = Add(2,3); 和 int ret = pf(2,3);? 等價(jià),其中第一個(gè)表達(dá)式中的 * 相當(dāng)于擺設(shè),無實(shí)際作用,但如果加了 * 千萬不要忘了加括號(hào),必須加括號(hào)!

例題:

下邊的兩行代碼的意思

1 . ( *(void?(*) () ) 0 ) ();

a、(void?(*) () )是函數(shù)指針類型,是強(qiáng)制類型轉(zhuǎn)換的作用;

b、(void?(*) () ) 0 對(duì)0進(jìn)行強(qiáng)制類型轉(zhuǎn)換,意思就是認(rèn)為0地址處放置著(void?(*) () )類型的函數(shù);

c、*(void?(*) () ) 0 對(duì)此函數(shù)進(jìn)行解引用

d、( *(void?(*) () ) 0 ) () 調(diào)用該函數(shù)

2 . void(*signal (int , void ( * ) (int)) ) (int);

? a、signal 先和括號(hào)結(jié)合,所以signal目前是一個(gè)函數(shù)

? b、signal (int , void ( * ) (int)) 表示signal的第一個(gè)參數(shù)是 int ,第二個(gè)參數(shù)是void ( * ) (int) 是一個(gè)函數(shù)指針類型;

? c、void(*signal (int , void ( * ) (int)) ) (int)? 表示函數(shù)的返回類型是void(*) (int)?

五、函數(shù)指針數(shù)組

例如有四個(gè)函數(shù):

int (*pf1) (int ,int) = Add;

int (*pf1) (int ,int) = Sub;

int (*pf1) (int ,int) = Mul;

int (*pf1) (int ,int) = Div;

函數(shù)指針數(shù)組的表達(dá)方式

int (*pf[5]) (int ,int) = {0, Add, Sub, Mul, Div}; pf首先和 [4] 結(jié)合

六、指向函數(shù)指針數(shù)組的指針

函數(shù)指針????????????????????????????????????????int (*pf) (int ,int ) = &Add;

函數(shù)指針數(shù)組? ? ? ? ? ? ? ????????? ? ? ? ? ?int (* pfarr[4]) (int , int);

指向函數(shù)中指針數(shù)組的指針? ?????????int (* (*p3)[4]) (int , int) = &pfarr;

七、回調(diào)函數(shù)

? ? ? ? 回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一 個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。

void test()
{
    printf("hehe\n");
}

void print_hehe(void (*p) ())
{
    if(1)
    {
        p();
    }
}

int main()
{
    print_hehe(test);
    return 0;
}

以上代碼,沒有調(diào)用函數(shù)? test(),將函數(shù)指針傳給了 print_hehe 由此函數(shù)通過? if? 條件和函數(shù)指針來調(diào)用函數(shù),此時(shí)? test()? 是回調(diào)函數(shù)。?

用法:

#includevoid menu()
{
    printf("##############################\n");
    printf("#####  1.Add       2.Sub  ####\n");
    printf("#####  3.Mul       4.Div  ####\n");
    printf("#####  0.exit             ####\n");
    printf("##############################\n");
}

int Add(int x, int y)
{
    return x + y;
}

int Sub(int x, int y)
{
    return x - y;
}

int Mul(int x, int y)
{
    return x * y;
}

int Div(int x, int y)
{
    return x / y;
}

void calc(int(*pf)(int, int))
{
    int x = 0;
    int y = 0;
    int ret = 0;

    printf("請輸入2個(gè)操作數(shù):>");
    scanf("%d%d", &x, &y);
    ret = pf(x, y);
    printf("ret=%d\n", ret);
}

int main()
{
    int input = 0;
    int ret = 0;

    do
    {
        menu();
        printf("請選擇:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            calc(Add);
            break;
        case 2:
            calc(Sub);
            break;
        case 3:
            calc(Mul);
            break;
        case 4:
            calc(Div);
            break;
        case 0:
            printf("退出!");
            break;
        default:
            printf("選擇錯(cuò)誤!");
            break;
        }
    } while (input);

    return 0;
}

上邊代碼中 calc() 就是回調(diào)函數(shù).

下邊是 qsort 的使用,qsort是一個(gè)庫函數(shù),是基于快速排序算法實(shí)現(xiàn)的一個(gè)排序函數(shù),qsort可以排序任意類型的數(shù)據(jù)。

void qsort (void* base,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 待排序數(shù)組的起始位置

size_t num,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?數(shù)組元素個(gè)數(shù)

size_t width,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一個(gè)元素的字節(jié)大小

int (*cmp)(const void*? e1,const void* e2)? ? ? ? 函數(shù)指針,cmp是比較函數(shù),e1、? e2是待比較兩個(gè)元素的地址。返回值是當(dāng)e1e2時(shí),返回>0的數(shù)。cmp是自定義的比較函數(shù)。

)

#include#includeint cmp_int(const void* e1, const void* e2)
{
    return (*(int*)e1 - *(int*)e2);
}

struct Stu
{
    char name[20];
    int age;
    double score;
};

int cmp_stu_by_age(const void* e1,const void* e2)
{
    return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

void test1()
{
    struct Stu arr[3] = { {"mike",20,55.5},{"lisa",30,88.0},{"kuka",50,90.0} };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);
}

void test()
{
    int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(arr[0]), cmp_int);
}

int main()
{
    test();
    test1();
    return 0;
}

注:

? a、void* 類型的指針可以接收任意類型的指針;

指針與數(shù)組相關(guān)例題解析

例1、

int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a))
    printf("%d\n",sizeof(a+0));
    printf("%d\n",sizeof(*a));
    printf("%d\n",sizeof(a+1));
    printf("%d\n",sizeof(a[1]));
    printf("%d\n",sizeof(&a));
    printf("%d\n",sizeof(*&a));
    printf("%d\n",sizeof(&a+1));
    printf("%d\n",sizeof(&a[0]));
    printf("%d\n",sizeof(&a[0]+1));
    return 0;
}

sizeof 計(jì)算對(duì)象所占內(nèi)存的大小,單位是字節(jié)。

printf("%d\n",sizeof(a))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?16
? printf("%d\n",sizeof(a+0));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 4/8? 表示數(shù)組首元素的地址
? printf("%d\n",sizeof(*a));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?4? ? ?表示第一個(gè)元素的大小
? printf("%d\n",sizeof(a+1));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 4/8? ?第二個(gè)元素的地址的大小
? printf("%d\n",sizeof(a[1]));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???4? ? ??第二個(gè)元素的大小
? printf("%d\n",sizeof(&a));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4/8? ? 數(shù)組的地址的大小
? printf("%d\n",sizeof(*&a));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 16? ? ? 計(jì)算整個(gè)數(shù)組的大小
? printf("%d\n",sizeof(&a+1));? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?4/8? ? 計(jì)算指向數(shù)組后邊數(shù)組處地址的大小
? printf("%d\n",sizeof(&a[0]));? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? 4/8? ? 第一個(gè)元素地址的大小
? printf("%d\n",sizeof(&a[0]+1));? ? ? ? ? ? ? ? ? ? ? ? ? ??4/8? ? 第二個(gè)元素地址的大小

例2、

int main()
{
    char arr[] = {'a','b','c','d','e','f'};
    printf("%d\n", sizeof(arr));
    printf("%d\n", sizeof(arr+0));
    printf("%d\n", sizeof(*arr));
    printf("%d\n", sizeof(arr[1]));
    printf("%d\n", sizeof(&arr));
    printf("%d\n", sizeof(&arr+1));
    printf("%d\n", sizeof(&arr[0]+1));

    printf("%d\n", strlen(arr));
    printf("%d\n", strlen(arr+0));
    printf("%d\n", strlen(*arr));
    printf("%d\n", strlen(arr[1]));
    printf("%d\n", strlen(&arr));
    printf("%d\n", strlen(&arr+1));
    printf("%d\n", strlen(&arr[0]+1));

    return 0;
}

sizeof 計(jì)算對(duì)象所占內(nèi)存的大小,單位是字節(jié)。

?printf("%d\n", sizeof(arr));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 6
? printf("%d\n", sizeof(arr+0));? ? ? ? ? ? ? ? ? ? ? ? ? ? 4/8
? printf("%d\n", sizeof(*arr));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1
? printf("%d\n", sizeof(arr[1]));? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? printf("%d\n", sizeof(&arr));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4/8
? printf("%d\n", sizeof(&arr+1));? ? ? ? ? ? ? ? ? ? ? ? ? 4/8
? printf("%d\n", sizeof(&arr[0]+1));? ? ? ? ? ? ? ? ? ? ? 4/8

? printf("%d\n", strlen(arr));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 隨機(jī)值
? printf("%d\n", strlen(arr+0));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 隨機(jī)值
? printf("%d\n", strlen(*arr));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?err,此時(shí)*arr是首元素,首元素的值是97,可能會(huì)發(fā)生越界
? printf("%d\n", strlen(arr[1]));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?err
? printf("%d\n", strlen(&arr));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 隨機(jī)值
? printf("%d\n", strlen(&arr+1));? ? ? ? ? ? ? ? ? ? ? ? ? ? 隨機(jī)值
? printf("%d\n", strlen(&arr[0]+1));? ? ? ? ? ? ? ? ? ? ? ? 隨機(jī)值

例3、

int main()
{
    char arr[] = "abcdef";
    printf("%d\n", sizeof(arr));
    printf("%d\n", sizeof(arr+0));
    printf("%d\n", sizeof(*arr));
    printf("%d\n", sizeof(arr[1]));
    printf("%d\n", sizeof(&arr));
    printf("%d\n", sizeof(&arr+1));
    printf("%d\n", sizeof(&arr[0]+1));
    printf("%d\n", strlen(arr));
    printf("%d\n", strlen(arr+0));
    printf("%d\n", strlen(*arr));
    printf("%d\n", strlen(arr[1]));
    printf("%d\n", strlen(&arr));
    printf("%d\n", strlen(&arr+1));
    printf("%d\n", strlen(&arr[0]+1));
    return 0;
}

sizeof 計(jì)算對(duì)象所占內(nèi)存的大小,單位是字節(jié)。

? printf("%d\n", sizeof(arr));? ? ? ? ? ? ? ? ? ? ? ? ?7
? printf("%d\n", sizeof(arr+0));? ? ? ? ? ? ? ? ? ? ?4/8 數(shù)組首元素地址
? printf("%d\n", sizeof(*arr));? ? ? ? ? ? ? ? ? ? ? ? 1? ? 首元素
? printf("%d\n", sizeof(arr[1]));? ? ? ? ? ? ? ? ? ? ?1
? printf("%d\n", sizeof(&arr));? ? ? ? ? ? ? ? ? ? ? 4/8??
? printf("%d\n", sizeof(&arr+1));? ? ? ? ? ? ? ? ? 4/8
? printf("%d\n", sizeof(&arr[0]+1));? ? ? ? ? ? ? 4/8

? printf("%d\n", strlen(arr));? ? ? ? ? ? ? ? ? ? ? ? ? 6
? printf("%d\n", strlen(arr+0));? ? ? ? ? ? ? ? ? ? ? 6
? printf("%d\n", strlen(*arr));? ? ? ? ? ? ? ? ? ? ? ? ?err
? printf("%d\n", strlen(arr[1]));? ? ? ? ? ? ? ? ? ? ??err
? printf("%d\n", strlen(&arr));? ? ? ? ? ? ? ? ? ? ? ? 6
? printf("%d\n", strlen(&arr+1));? ? ? ? ? ? ? ? ? ?隨機(jī)值
? printf("%d\n", strlen(&arr[0]+1));? ? ? ? ? ? ? ? 5

例4、

int main()
{
    char *p = "abcdef";
    printf("%d\n", sizeof(p));
    printf("%d\n", sizeof(p+1));
    printf("%d\n", sizeof(*p));
    printf("%d\n", sizeof(p[0]));
    printf("%d\n", sizeof(&p));
    printf("%d\n", sizeof(&p+1));
    printf("%d\n", sizeof(&p[0]+1));
    printf("%d\n", strlen(p));
    printf("%d\n", strlen(p+1));
    printf("%d\n", strlen(*p));
    printf("%d\n", strlen(p[0]));
    printf("%d\n", strlen(&p));
    printf("%d\n", strlen(&p+1));
    printf("%d\n", strlen(&p[0]+1));
    return 0;
}

sizeof 計(jì)算對(duì)象所占內(nèi)存的大小,單位是字節(jié)。

? printf("%d\n", sizeof(p));? ? ? ? ? ? ? ? ? ? ? ? 4/8
? printf("%d\n", sizeof(p+1));? ? ? ? ? ? ? ? ? ? 4/8
? printf("%d\n", sizeof(*p));? ? ? ? ? ? ? ? ? ? ? ?1?
? printf("%d\n", sizeof(p[0]));? ? ? ? ? ? ? ? ? ? ?1
? printf("%d\n", sizeof(&p));? ? ? ? ? ? ? ? ? ? ? ?4/8
? printf("%d\n", sizeof(&p+1));? ? ? ? ? ? ? ? ? ?4/8
? printf("%d\n", sizeof(&p[0]+1));? ? ? ? ? ? ? ?4/8
? printf("%d\n", strlen(p));? ? ? ? ? ? ? ? ? ? ? ? ? 6
? printf("%d\n", strlen(p+1));? ? ? ? ? ? ? ? ? ? ? 5??
? printf("%d\n", strlen(*p));? ? ? ? ? ? ? ? ? ? ? ?? err
? printf("%d\n", strlen(p[0]));? ? ? ? ? ? ? ? ? ? ? err
? printf("%d\n", strlen(&p));? ? ? ? ? ? ? ? ? ? ? ? 隨機(jī)值
? printf("%d\n", strlen(&p+1));? ? ? ? ? ? ? ? ? ? 隨機(jī)值
? printf("%d\n", strlen(&p[0]+1));? ? ? ? ? ? ? ? 5

例5、

int main()
{
    inta[3][4] = {0};
    printf("%d\n",sizeof(a));
    printf("%d\n",sizeof(a[0][0]));
    printf("%d\n",sizeof(a[0]));
    printf("%d\n",sizeof(a[0]+1));
    printf("%d\n",sizeof(*(a[0]+1)));
    printf("%d\n",sizeof(a+1));
    printf("%d\n",sizeof(*(a+1)));
    printf("%d\n",sizeof(&a[0]+1));
    printf("%d\n",sizeof(*(&a[0]+1)));
    printf("%d\n",sizeof(*a));
    printf("%d\n",sizeof(a[3]));
    return 0;
}

sizeof 計(jì)算對(duì)象所占內(nèi)存的大小,單位是字節(jié)。

? printf("%d\n",sizeof(a));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?48? ? ? ? ? ? ? ? ? ? ? ? ?
? printf("%d\n",sizeof(a[0][0]));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4?
? printf("%d\n",sizeof(a[0]));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 16? 第一行的大小
? printf("%d\n",sizeof(a[0]+1));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4/8? 第一行首元素的地址+1是第一行第二個(gè)元素的地址
? printf("%d\n",sizeof(*(a[0]+1)));? ? ? ? ? ? ? ? ? ? ? ? ? ??4? ? ?第一行第二個(gè)元素
? printf("%d\n",sizeof(a+1));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4/8? ?a表示二維數(shù)組第一行的地址,a+1是第二行的地址
? printf("%d\n",sizeof(*(a+1)));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 16? 對(duì)第二行的地址解引用
? printf("%d\n",sizeof(&a[0]+1));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4/8 第二行的地址
? printf("%d\n",sizeof(*(&a[0]+1)));? ? ? ? ? ? ? ? ? ? ? ? ? ?16? 第二行的大小

printf("%d\n",sizeof(*a));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 16? 第一行的大小
? printf("%d\n",sizeof(a[3]));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 16? 第四行的大小,此時(shí)雖然越界,但沒有訪問,所以可以正常運(yùn)行。

例6、

int main()
{
 ? ?int a[5] = { 1, 2, 3, 4, 5 };
 ? ?int*ptr= (int*)(&a+1);
 ? ?printf( "%d,%d", *(a+1), *(ptr-1)); ? ?
    return0;
}

結(jié)果是2、5

例7、

struct Test
{
    int Num;
    char*pcName;
    short sDate;
    char cha[2];
    short sBa[4];
}*p;

int main()
{
    p=0x100000;
    printf("%p\n", p+0x1);
    printf("%p\n", (unsignedlong)p+0x1);
    printf("%p\n", (unsignedint*)p+0x1);
    return0;
}

答案是:?

00100014? ? ? ? ? 當(dāng)結(jié)構(gòu)體指針+1時(shí),加的是結(jié)構(gòu)體的大小,所以加20,又因?yàn)槭?6進(jìn)制表示

00100001? ? ? ? ? 指針變量p被轉(zhuǎn)換成無符號(hào)長整型變量,所以+1是就是數(shù)值直接+1

00100004? ? ? ? ? 指針變量p被轉(zhuǎn)換成整形指針,+1 就是加一個(gè)整形的大小

例8、

int main()
{
 ? ?int a[4] = { 1, 2, 3, 4 };
 ? ?int* ptr1= (int*)(&a+1);
 ? ?int* ptr2= (int*)((int)a+1);
 ? ?printf( "%x,%x", ptr1[-1], *ptr2); 
 ? ?return 0;
}

答案? ? 0x4? ?0x20000000

例9、

#includeint main()
{
 ? ?int a[3][2] = { (0, 1), (2, 3), (4, 5) };
 ? ?int* p;
 ? ?p = a[0];
 ? ?printf( "%d", p[0]);
    return 0;
}

答案是:1;因?yàn)榛ɡㄌ?hào)中的小括號(hào)相當(dāng)于逗號(hào)表達(dá)式,所以數(shù)組 a 的初始化相當(dāng)于,a[3][2]={1,3,5};而 a[0]是第一行的地址,打印時(shí),打印第一行的首元素。

例10、

int main()
{
 ? ?int a[5][5];
 ? ?int(*p)[4];
 ? ?p=a;
 ? ?printf( "%p,%d\n", &p[4][2] -&a[4][2], &p[4][2] -&a[4][2]);
 ? ?return0;
}

答案: FFFFFFFC,? -4

p[4][2] 等價(jià)于 *(*(p+4)+2)? ; p 最初是數(shù)組名,也就是數(shù)組首元素的地址,p是一個(gè)數(shù)組指針,p+1相當(dāng)于,向后跳過四個(gè)元素,而指針-指針得到的是指針之間的元素個(gè)數(shù)。自行畫圖

例11、

int main()
{
 ? ?int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 ? ?int*ptr1= (int*)(&aa+1);
 ? ?int*ptr2= (int*)(*(aa+1));
 ? ?printf( "%d,%d", *(ptr1-1), *(ptr2-1));
 ? ?return 0;
}

答案:10? ?5

例12、

int main()
{
    char*a[] = {"work","at","alibaba"};
    char**pa=a;
    pa++;
    printf("%s\n", *pa);
    return 0;
}

答案:at

因?yàn)?char *a[] 中存的是這三個(gè)字符串的首字符的地址;

char** pa 中存的是 a 的地址;

pa 最初是指向 a 數(shù)組的第一個(gè)元素,即? "work" 中w的地址;

pa++ 后指向了 a 數(shù)組中第二個(gè)元素,即 "at" 中 a 的地址;

又因?yàn)閿?shù)組中每個(gè)字符串最后都有一個(gè)? \n? 所以最后打印? at。?

例13、

int main()
{
    char*c[] = {"ENTER","NEW","POINT","FIRST"};
    char**cp[] = {c+3,c+2,c+1,c};
    char***cpp=cp;
    printf("%s\n", **++cpp);
    printf("%s\n", *--*++cpp+3);
    printf("%s\n", *cpp[-2]+3);
    printf("%s\n", cpp[-1][-1]+1);
    return0 ;
}

答案: POINT????????ER? ? ? ? ST? ? ? ? EW

*cpp[-2]? 等價(jià)于 **(cpp-2)+3;

cpp[-1][-1]? 等價(jià)于? *(*(cpp-1)-1)+1`;

C8 39

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

標(biāo)題名稱:【C語言進(jìn)階】二、指針-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://bm7419.com/article0/dicjoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站建設(shè)、App設(shè)計(jì)、網(wǎng)站營銷、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司