該篇與上篇銜接
創(chuàng)新互聯(lián)"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機(jī)版的企業(yè)網(wǎng)站。實(shí)現(xiàn)跨屏營(yíng)銷(xiāo),產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動(dòng)網(wǎng)絡(luò)一網(wǎng)打盡,滿(mǎn)足企業(yè)的營(yíng)銷(xiāo)需求!創(chuàng)新互聯(lián)具備承接各種類(lèi)型的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站項(xiàng)目的能力。經(jīng)過(guò)10年的努力的開(kāi)拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶(hù)的一致好評(píng)。二維數(shù)組int main()
{int a[3][4] = {0 };
printf("%d\n", sizeof(a));//48 3*4*sizeof(int)
printf("%d\n", sizeof(a[0][0]));//4 第一行第一個(gè)元素 就是整形大小
printf("%d\n", sizeof(a[0]));//16
//a[0]就可以理解為 第一行數(shù)組名
//sizeof(a[0])數(shù)組名a【0】單獨(dú)放在sizeof內(nèi)部 a【0】表示整個(gè)第一行
//sizeof(a[0])計(jì)算的就是第一行的大小
printf("%d\n", sizeof(a[0]+1));//4/8 符合sizeof規(guī)則第三條 所以他叔第一行第一個(gè)元素的地址
printf("%d\n", sizeof( * (a[0] + 1)));//4 第一行第二個(gè)解引用 , 的到元素
printf("%d\n", sizeof(a+1));//4/8 對(duì)于二維數(shù)組來(lái)說(shuō) 首元素就是第一行
printf("%d\n", sizeof(*(a+1)));//16 *(a+1)->a[1]
printf("%d\n", sizeof(&a[0]+1));// 4/8
printf("%d\n", sizeof(*(&a[0] + 1)));// 16
printf("%d\n", sizeof(*a));// 16 a是代表整個(gè)數(shù)組 *a 代表的是對(duì)第一行解應(yīng)用 得到的是第一行的數(shù)組
printf("%d\n", sizeof(a[3]));//16 既然a[3]存在它的類(lèi)型就是int()[4] 假象他是一個(gè)第四行
return 0;
}
int main()
{short s = 5;
int a = 4;
printf("%d", sizeof(s = a + 6));//2 最后的結(jié)果由short而定 short2個(gè)字節(jié)。sizeof內(nèi)部表達(dá)式不參與運(yùn)算
printf("%d", s);//5
return 0;
}
第三個(gè)解析
int main()
{int a[5] = {1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0; //第一個(gè)打印:a的地址沒(méi)變 指向一 加一指向2的地址
}
//程序的結(jié)果是什么?
//2 5
解析
//由于我還沒(méi)介紹過(guò)結(jié)構(gòu)體,這里告知結(jié)構(gòu)體的大小是20個(gè)字節(jié)
struct Test
{int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假設(shè)p 的值為0x100000。 如下表表達(dá)式的值分別為多少?
//已知,結(jié)構(gòu)體Test類(lèi)型的變量大小是20個(gè)字節(jié)
int main()
{ printf("%p\n", p + 0x1);//相當(dāng)于p+1 加1跳過(guò)一個(gè)類(lèi)型 結(jié)構(gòu)體類(lèi)型20個(gè)字節(jié)直接跳過(guò)所以是加20 0x100000+20=0x100014 4成16的0次方。。。
printf("%p\n", (unsigned long)p + 0x1);//0x100001 正數(shù)加1就是1 不跟指針一樣
printf("%p\n", (unsigned int*)p + 0x1);//0x100004 +4 一個(gè)整形字節(jié)
return 0;
}
int main()
{int a[4] = {1, 2, 3, 4 };
int* ptr1 = (int*)(&a + 1);
int* ptr2 = (int*)((int)a + 1);// a轉(zhuǎn)化為整形 一個(gè)整形4個(gè)字節(jié) 加1是加一個(gè)字節(jié)
printf("%x,%x", ptr1[-1], *ptr2);
return 0;
}
%x打印打印16進(jìn)制 只打印有效數(shù)組所以結(jié)果為4 2000000
#includeint main()
{int a[3][2] = {(0, 1), (2, 3), (4, 5) };
int* p;
p = a[0];
printf("%d", p[0]);
return 0;
}
解析
#includeint main()
{int a[3][2] = {(0, 1), (2, 3), (4, 5) };//用了小括號(hào)表示是逗號(hào)表達(dá)式 相當(dāng)于就放了{(lán)1,3,5}第一行放了1 3 第二行5 0 第三行00
int* p;
p = a[0];//沒(méi)有& 也沒(méi)放在sizeof內(nèi)部 所以他代表首元素地址 1 放到了整形指針
printf("%d", p[0]);//結(jié)果1 *(p+0)
return 0;
}//a[0]表示第一行,然后沒(méi)有&,也沒(méi)有sizeof,所以是首元素,加起來(lái)就是a[0]這一行的首元素
int main()
{int a[5][5];
int(*p)[4];
p = a;//int (*)[5]
printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//?
return 0;
}
int main()
{int a[5][5];
int(*p)[4];
p = a;//int (*)[5]
printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//&p[4][2] 可以理解為 (*(p+4)+2) 解引用相當(dāng)于從當(dāng)前位置訪問(wèn)一個(gè)數(shù)組 剛好int四個(gè) 然后加2
return 0;
}
**結(jié)果FFFFFFFC,4 **
C是12
//&p[4][2] 可以理解為 (*(p+4)+2) 解引用相當(dāng)于從當(dāng)前位置訪問(wèn)一個(gè)數(shù)組p[4] 剛好int四個(gè) 然后加2
指針-指針 得到指針見(jiàn)的元素個(gè)數(shù)
因?yàn)榈刂酚傻偷礁咦兓〉刂窚p去大地址所以是-4
-4以%d打印就是-4 認(rèn)為內(nèi)存里放的有符號(hào)整數(shù) 以%p打印認(rèn)為內(nèi)存里是個(gè)地址 所以將地址補(bǔ)碼直接拿出來(lái) 因?yàn)?p所以以16進(jìn)制書(shū)寫(xiě) 4個(gè)1是一個(gè)f如下
- 4 寫(xiě)到內(nèi)存就是
10000000000000000000000000000000100
111111111111111111111111111111111111011
111111111111111111111111111111111111100
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;
}
int main()
{int aa[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* ptr1 = (int*)(&aa + 1);//10 賦給ptr1的時(shí)候他就是個(gè)整形了 下面的-1是減去一個(gè)整形 所以打印10
int* ptr2 = (int*)(*(aa + 1));//5 對(duì)第二行解引用拿到第二行 拿到第二行相當(dāng)于拿到數(shù)組名??梢詫?xiě)成aa[1] 他就是6的地址 本身是個(gè)整形在解引用整形無(wú)意義
printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
return 0;
}
#includeint main()
{char* a[] = {"work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
int main()
{char* a[] = {"work","at","alibaba" };//數(shù)組名表示首元素地址 首元素地址表示char*
char** pa = a;//相當(dāng)于pa指向第一個(gè)的char*
pa++;//指向“at”的char* pa指向數(shù)組,+1指向下一個(gè)元素
printf("%s\n", *pa);//解引用at 從這里向后打印字符串
return 0;
}//at
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);
return 0;
}
第一次解引用拿到c+2 第二次拿到了 char*內(nèi)容 所以打印 POINT
printf("%s\n", *-- * ++cpp + 3);//++優(yōu)先級(jí)高 --就是對(duì)c+1 減去1 后變成c 如果是c 指向位置也會(huì)發(fā)生改變 再解引用拿到 ENTER 加3 指向T。從E向后打印打印結(jié)果ER
*cpp[-2]可以寫(xiě)成 **(cpp-2) +3指向R打印ST
printf("%s\n", cpp[-1][-1] + 1);//cpp[-1][-1] 可以寫(xiě)成 (*(*(cpp-1)-1)+1 結(jié)果EW
總體打印結(jié)果POINT ER ST EW
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧