国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言:指針【進階】習題練習及分析講解

這篇具有很好參考價值的文章主要介紹了C語言:指針【進階】習題練習及分析講解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言:

前面我們剛剛學完了C語言:指針詳解【進階】的知識,這部分的知識還是要重在理解加實踐,今天我這里就分享一些有關C語言指針方面的練習供大家更深入的理解指針的知識。
我們初期的指針學習大部分都是與數(shù)組的知識綁定在一起的,所以今天的練習也是大多與數(shù)組有關的,目的是透過數(shù)組中指針的操作幫助強化理解指針在內(nèi)存中的是如何操作的。


話不多說,直接上題:

一維數(shù)組

關于數(shù)組對于sizeof()和strlen函數(shù)的使用,這里先回顧一下:

數(shù)組名大部分情況下代表數(shù)組的首元素的地址

有兩種情況例外:

  1. 數(shù)組名單獨放在sizeof內(nèi)部,這里數(shù)組名代表整個數(shù)組,計算的是整個數(shù)組的大小
  2. &數(shù)組名,這里取出的是整個數(shù)組的地址

sizeof()計算的是數(shù)據(jù)在內(nèi)存中所占的字節(jié)大小
strlen函數(shù)只能計算字符串的長度,計算過程中遇到\0結束

關于strlen函數(shù)和sizeof()的練習

下面程序輸出結果是什么?

整型數(shù)組

練習一:

#include <stdio.h>
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;
}

結果:
C語言:指針【進階】習題練習及分析講解

分析:

內(nèi)存:

C語言:指針【進階】習題練習及分析講解

對應題查看對應顏色的解釋哦。

C語言:指針【進階】習題練習及分析講解


字符數(shù)組

練習二:

#include <stdio.h>
#include <string.h>
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));
	return 0;
}

這里分兩部分練習(sizeof的為一部分,strlen的為一部分)
sizeof的結果:
C語言:指針【進階】習題練習及分析講解
分析:

內(nèi)存:
C語言:指針【進階】習題練習及分析講解
C語言:指針【進階】習題練習及分析講解


strlen的結果:

注意:strlen函數(shù)的參數(shù)類型

C語言:指針【進階】習題練習及分析講解

分析:
C語言:指針【進階】習題練習及分析講解
練習三:

#include <stdio.h>
#include <string.h>
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;
}

注意這里的字符數(shù)組在內(nèi)存中的存儲形式

這里分兩部分練習(sizeof的為一部分,strlen的為一部分)
sizeof的結果:
C語言:指針【進階】習題練習及分析講解

分析:

內(nèi)存:注意這個數(shù)組后面還放了'\0','\0'也要占一個字節(jié)
C語言:指針【進階】習題練習及分析講解
C語言:指針【進階】習題練習及分析講解


strlen的結果:

注意:strlen函數(shù)的參數(shù)類型

C語言:指針【進階】習題練習及分析講解

分析:
C語言:指針【進階】習題練習及分析講解


指針

練習三:

#include <stdio.h>
#include <string.h>
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的為一部分,strlen的為一部分)
sizeof的結果:
C語言:指針【進階】習題練習及分析講解
分析:

內(nèi)存:
C語言:指針【進階】習題練習及分析講解
C語言:指針【進階】習題練習及分析講解


strlen的結果:

注意:strlen函數(shù)的參數(shù)類型

C語言:指針【進階】習題練習及分析講解

分析:
C語言:指針【進階】習題練習及分析講解
練習三:

#include <stdio.h>
#include <string.h>
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;
}

注意這里的字符串在內(nèi)存中的存儲形式

這里分兩部分練習(sizeof的為一部分,strlen的為一部分)
sizeof的結果:
C語言:指針【進階】習題練習及分析講解

分析:

內(nèi)存:注意這個字符串后面還放了'\0','\0'也要占一個字節(jié)

C語言:指針【進階】習題練習及分析講解
C語言:指針【進階】習題練習及分析講解


strlen的結果:

注意:strlen函數(shù)的參數(shù)類型

C語言:指針【進階】習題練習及分析講解

分析:
C語言:指針【進階】習題練習及分析講解

傳入的是二級指針時指向的就是指針p的地址,strlen計算的就是從p的地址開始向后計算遇到\0時的長度。


二維數(shù)組

練習四:

#include <stdio.h>
int main()
{
	int a[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;
}

結果:
C語言:指針【進階】習題練習及分析講解

分析:
該二維數(shù)組在內(nèi)存中是三個一維數(shù)組連續(xù)存放的。

內(nèi)存:

C語言:指針【進階】習題練習及分析講解

C語言:指針【進階】習題練習及分析講解


筆試題

通過上面的練習,相信你應該已經(jīng)能理解指針在內(nèi)存中的操作了,下面是幾道筆試題,一起來檢驗一下學習成果吧。


筆試題1:

#include <stdio.h>
int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int* ptr = (int*)(&a + 1);
	printf("%d,%d", *(a + 1), *(ptr - 1));
	return 0;
}
//程序的結果是什么?

結果:
C語言:指針【進階】習題練習及分析講解

分析:
C語言:指針【進階】習題練習及分析講解
C語言:指針【進階】習題練習及分析講解


筆試題2:

//由于還沒深入學習結構體,這里告知結構體Test類型的大小是20個字節(jié)
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
#include <stdio.h>
int main()
{
	p = 0x100000;
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

結果:
C語言:指針【進階】習題練習及分析講解

分析:
C語言:指針【進階】習題練習及分析講解

C語言:指針【進階】習題練習及分析講解


筆試題3:

#include <stdio.h>
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;
}

結果:
C語言:指針【進階】習題練習及分析講解

分析:

%x :打印16進制的數(shù)字
注意:這里需要畫更細致的內(nèi)存分布圖才能分析清指針的操作
(默認小端存儲)

C語言:指針【進階】習題練習及分析講解
C語言:指針【進階】習題練習及分析講解


筆試題4:

#include <stdio.h>
int main()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
	int* p;
	p = a[0];
	printf("%d", p[0]);
	return 0;
}

結果:
C語言:指針【進階】習題練習及分析講解

分析:
這道題其實考的是大家對操作符的了解,對于一個二維數(shù)組來說,要在二維數(shù)組內(nèi)初始化,需要用到的是{},而不是(),這里的()是逗號表達式的操作符。

( , , ):逗號表達式是以此執(zhí)行括號內(nèi)的語句,但只有最后一句的表達式是整個逗號表達式的值。

所以,這里的二維數(shù)組中只初始化了前三個元素1,2,3,后面的元素都為0,a[0]代表第一行的地址,p[0]就是第一行第一個元素1。


筆試題5:

#include <stdio.h>
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]);
	return 0;
}

結果:
C語言:指針【進階】習題練習及分析講解

分析:

這里要注意不同類型的指針一次能訪問到的空間是不同的
注意:地址是16進制數(shù)字

C語言:指針【進階】習題練習及分析講解


筆試題6:

#include <stdio.h>
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;
}

結果:
C語言:指針【進階】習題練習及分析講解

分析:

C語言:指針【進階】習題練習及分析講解


筆試題7:

#include <stdio.h>
int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

結果:
C語言:指針【進階】習題練習及分析講解

分析:

C語言:指針【進階】習題練習及分析講解


筆試題8:

#include <stdio.h>
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語言:指針【進階】習題練習及分析講解

分析:

這里必須把內(nèi)存布局畫出來,才能清晰的觀察指針的動向。
注意:cpp進行++--操作后,指針的指向是要發(fā)生變化的。

C語言:指針【進階】習題練習及分析講解


本篇有關C語言指針進階的練習就到此結束了,希望你能從中學習到在面對指針問題時,盡量畫出指針的內(nèi)存操作圖,進而解題的思路。
重點說三遍:
畫圖!
畫圖!!
還是畫圖!?。?/strong>
如果你還有什么問題可以評論區(qū)討論或私信我哦。??

下一篇文章將會對前面C語言指針【進階】中的qsort函數(shù)的模擬實現(xiàn)寫一篇博客,保證簡單易懂,看完就會。
再往后我們會對字符串的研究進行深入了解,并講解一系列關鍵的字符串函數(shù)和內(nèi)存函數(shù),和它們的模擬實現(xiàn)。


感興趣的的小伙伴點點贊,點點關注,謝謝大家的閱讀哦?。?!
點點關注,后期不錯過哦。??
你們的鼓勵就是我的動力,歡迎下次繼續(xù)閱讀?。?!??????文章來源地址http://www.zghlxwxcb.cn/news/detail-432634.html

到了這里,關于C語言:指針【進階】習題練習及分析講解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【C語言】指針的進階(二)—— 回調(diào)函數(shù)的講解以及qsort函數(shù)的使用方式

    【C語言】指針的進階(二)—— 回調(diào)函數(shù)的講解以及qsort函數(shù)的使用方式

    目錄 1、函數(shù)指針數(shù)組 1.1、函數(shù)指針數(shù)組是什么? ?1.2、函數(shù)指針數(shù)組的用途:轉(zhuǎn)移表 2、擴展:指向函數(shù)指針的數(shù)組的指針 3、回調(diào)函數(shù) 3.1、回調(diào)函數(shù)介紹 ?3.2、回調(diào)函數(shù)的案例:qsort函數(shù) 3.2.1、回顧冒泡排序 ?3.2.1、什么是qsort函數(shù)? 函數(shù)指針數(shù)組 是什么?首先主語是 數(shù)

    2024年02月07日
    瀏覽(22)
  • 10 SQL進階 -- 綜合練習題 -- 10道經(jīng)典SQL題目,配套數(shù)據(jù)與解答

    10 SQL進階 -- 綜合練習題 -- 10道經(jīng)典SQL題目,配套數(shù)據(jù)與解答

    點擊下方鏈接直接下載 創(chuàng)建數(shù)據(jù)表腳本:http://tianchi-media.oss-cn-beijing.aliyuncs.com/dragonball/SQL/create_table.sql 執(zhí)行建表語句 執(zhí)行成功 查看創(chuàng)建的表 點擊下方鏈接直接下載 插入數(shù)據(jù)腳本:https://tianchi-media.oss-cn-beijing.aliyuncs.com/dragonball/SQL/data.zip 大家下載好腳本后,先在MySQL環(huán)境中運

    2024年04月27日
    瀏覽(21)
  • 習題練習 C語言

    習題練習 C語言

    首先我們要了解什么是offsetof宏: . 此具有函數(shù)形式的宏返回數(shù)據(jù)結構或聯(lián)合類型中成員成員的偏移值(以字節(jié)為單位)。 . 返回的值是size_t類型的無符號整數(shù)值,其字節(jié)數(shù)位于指定成員與其結構開頭之間。 什么意思呢,可以看到下面這張圖片: 下面我們來看到這一習題:

    2024年02月14日
    瀏覽(24)
  • C語言習題練習

    C語言習題練習

    首先我們要了解什么是offsetof宏: . 此具有函數(shù)形式的宏返回數(shù)據(jù)結構或聯(lián)合類型中成員成員的偏移值(以字節(jié)為單位)。 . 返回的值是size_t類型的無符號整數(shù)值,其字節(jié)數(shù)位于指定成員與其結構開頭之間。 什么意思呢,可以看到下面這張圖片: 下面我們來看到這一習題:

    2024年02月15日
    瀏覽(35)
  • 習題練習 C語言(暑期)

    習題練習 C語言(暑期)

    今天為大家分享我暑假期間所練習的一些小題目! 相信大家看完之后都會有所提升的! 加油! 以下不正確的定義語句是( ) A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0}; B: char c2[] = {‘x10’, ‘xa’, ‘8’}; C: char c1[] = {‘1’,‘2’,‘3’,‘4’,‘5’}; D: int y[5+3]={0, 1, 3, 5, 7, 9}; 題目解

    2024年02月10日
    瀏覽(31)
  • 日志審計與分析練習題

    1.? ( 單選題) 【單選題】以下關于日志的描述不正確的是( ) A. 日志是在事故發(fā)生后查明“發(fā)生了什么”的一個很好的“取證”信息來源,但無法為審計進行跟蹤 B. 日志是由各種不同的實體產(chǎn)生的“安全記錄”的集合 C. 通常為計算機系統(tǒng)、設備、軟件等在某種情況下記錄的信息

    2024年02月08日
    瀏覽(32)
  • C 語言練習題更新

    目錄(先不要看答案,首先自己做才能更好的領悟,做不來沒關系) 題目一:有 1、2、3、4 四個數(shù)字,能組成多少個互不相同且無重復數(shù)字的三位數(shù)?都是多少? 程序分析:可填在百位、十位、個位的數(shù)字都是 1、2、3、4,組成所有的排列后再去掉不滿足條件的排列。 題目

    2024年02月14日
    瀏覽(25)
  • C語言之練習題

    C語言之練習題

    歡迎來到我的: 世界 希望作者的文章對你有所幫助,有不足的地方還請指正,大家一起學習交流 ! 這期文章由:兩題問答題+四道編程題;小孩在文章中寫有詳細解題思路,感謝大家支持支持。 思路: 首先我們要知道 x=x(x-1) 的含義; 假設x=3;也就是 011 ; 而x-1=2;是 010 ;

    2024年02月10日
    瀏覽(40)
  • C語言之數(shù)組練習題

    C語言之數(shù)組練習題

    第1關:數(shù)組插入元素 300 任務要求 參考答案 評論106 任務描述 相關知識 數(shù)組 數(shù)組元素的表示方法 編程要求 測試說明 任務描述 本關需要你將一個數(shù)插入到一組已經(jīng)排好序的數(shù)組并輸出。 相關知識 數(shù)組在程序設計中,為了處理方便, 把具有相同類型的若干變量按有序的形式

    2024年02月05日
    瀏覽(25)
  • 【C語言】練習題整理:11

    今天是10道選擇題 下面代碼段的輸出結果是: -12 自右至左的結合方向稱為“右結合性”。最典型的右結合 性運算符是賦值運算符。 如x=y=z,由于“=”的右結合性,應先執(zhí)行y=z,再執(zhí)行x=(y=z)運算。 C語言運算符中有不少為右結合性,應注意區(qū)別,以避免理解錯誤。 計算順序是

    2024年02月11日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包