国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C語言 數組指針詳解及示例代碼

C語言 數組指針詳解及示例代碼

2021-04-14 14:15C語言教程網 C/C++

本文主要介紹C語言 數組指針,這里整理了相關資料并附示例待會及實現結果,幫助大家學習C語言中指針的知識,有需要學習此部分內容的朋友可以參考下

數組(Array)是一系列具有相同類型的數據的集合,每一份數據叫做一個數組元素(Element)。數組中的所有元素在內存中是連續排列的,整個數組占用的是一塊內存。以int arr[] = { 99, 15, 100, 888, 252 };為例,該數組在內存中的分布如下圖所示:

C語言 數組指針詳解及示例代碼

定義數組時,要給出數組名和數組長度,數組名可以認為是一個指針,它指向數組的第 0 個元素。C語言中,我們將第 0 個元素的地址稱為數組的首地址。以上面的數組為例,下圖是 arr 的指向:

C語言 數組指針詳解及示例代碼

下面的例子演示了如何以指針的方式遍歷數組元素:

?
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int len = sizeof(arr) / sizeof(int); //求數組長度
 int i;
 for(i=0; i<len; i++){
  printf("%d ", *(arr+i) ); //*(arr+i)等價于arr[i]
 }
 printf("\n");
 return 0;
}

運行結果:

99  15  100  888  252

第 4 行代碼用來求數組的長度,sizeof(arr) 會獲得整個數組所占用的字節數,sizeof(int) 會獲得一個數組元素所占用的字節數,它們相除的結果就是數組包含的元素個數,也即數組長度。

第 8 行代碼中我們使用了*(arr+i)這個表達式,arr 是數組名,指向數組的第 0 個元素,表示數組首地址, arr+i 指向數組的第 i 個元素,*(arr+i) 表示取第 i 個元素的數據,它等價于 arr[i]。
arr 是int*類型的指針,每次加 1 時它自身的值會增加 sizeof(int),加 i 時自身的值會增加 sizeof(int) * i,這在《指針變量的運算》中已經進行了詳細講解。

我們也可以定義一個指向數組的指針,例如:

int arr[] = { 99, 15, 100, 888, 252 };
int *p = arr;

arr 本身就是一個指針,可以直接賦值給指針變量 p。arr 是數組第 0 個元素的地址,所以int *p = arr;也可以寫作int *p = &arr[0];。也就是說,arr、p、&arr[0] 這三種寫法都是等價的,它們都指向數組第 0 個元素,或者說指向數組的開頭。

如果一個指針指向了數組,我們就稱它為數組指針(Array Pointer)。

需要注意是,數組本身沒有類型,數組元素才有類型,p 指向的數組元素是 int 類型,所以 p 的類型必須也是int *。

反過來想,p 并不知道它指向的是一個數組,p 只知道它指向的是一個整數,究竟如何使用 p 取決于程序員的編碼。

更改上面的代碼,使用數組指針來遍歷數組元素:

?
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int i, *p = arr, len = sizeof(arr) / sizeof(int);
 for(i=0; i<len; i++){
  printf("%d ", *(p+i) );
 }
 printf("\n");
 return 0;
}

數組在內存中只是數組元素的簡單排列,沒有開始和結束標志,在求數組的長度時不能使用sizeof(p) / sizeof(int),因為 p 只是一個指向 int 類型的指針,編譯器并不知道它指向的到底是一個整數還是一系列整數(數組),所以 sizeof(p) 求得的是 p 這個指針變量本身所占用的字節數,而不是整個數組占用的字節數。

也就是說,根據數組指針不能逆推出整個數組元素的個數,以及數組從哪里開始、到哪里結束等信息。

上節我們講到,對指針變量進行加法和減法運算時,是根據數據類型的長度來計算的。如果一個指針變量 p 指向了數組的開頭,那么 p+i 就指向數組的第 i 個元素;如果 p 指向了數組的第 n 個元素,那么 p+i 就是指向第 n+i 個元素;而不管 p 指向了數組的第幾個元素,p+1 總是指向下一個元素,p-1 也總是指向上一個元素。

更改上面的代碼,讓 p 指向數組中的第二個元素:

?
1
2
3
4
5
6
7
#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int *p = &arr[2]; //也可以寫作 int *p = arr + 2;
 printf("%d, %d, %d, %d, %d\n", *(p-2), *(p-1), *p, *(p+1), *(p+2) );
 return 0;
}

運行結果:

99, 15, 100, 888, 252

引入數組指針后,我們就有兩種方案來訪問數組元素了,一種是使用下標,另外一種是使用指針。

1) 使用下標

也就是采用 arr[i] 的形式訪問數組元素。如果 p 是指向數組 arr 的指針,那么也可以使用 p[i] 來訪問數組元素,它等價于 arr[i]。

2) 使用指針

也就是使用 *(p+i) 的形式訪問數組元素。另外數組名本身也是指針,也可以使用 *(arr+i) 來訪問數組元素,它等價于 *(p+i)。

不管是數組名還是數組指針,都可以使用上面的兩種方式來訪問數組元素。不同的是,數組名是常量,它的值不能改變,而數組指針是變量(除非特別指明它是常量),它的值可以任意改變。也就是說,數組名只能指向數組的開頭,而數組指針可以先指向數組開頭,再指向其他元素。

更改上面的代碼,借助自增運算符來遍歷數組元素:

?
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int i, *p = arr, len = sizeof(arr) / sizeof(int);
 for(i=0; i<len; i++){
  printf("%d ", *p++ );
 }
 printf("\n");
 return 0;
}

運行結果:

99  15  100  888  252

第 8 行代碼中,*p++ 應該理解為 *(p++),每次循環都會改變 p 的值(p++ 使得 p 自身的值增加),以使 p 指向下一個數組元素。該語句不能寫為 *arr++,因為 arr 是常量,而 arr++ 會改變它的值,這顯然是錯誤的。

關于數組指針的謎題

假設 p 是指向數組 arr 中第 n 個元素的指針,那么 *p++、*++p、(*p)++ 分別是什么意思呢?

*p++ 等價于 *(p++),表示先取得第 n 個元素的值,再將 p 指向下一個元素,上面已經進行了詳細講解。

*++p 等價于 *(++p),會先進行 ++p 運算,使得 p 的值增加,指向下一個元素,整體上相當于 *(p+1),所以會獲得第 n+1 個數組元素的值。

(*p)++ 就非常簡單了,會先取得第 n 個元素的值,再對該元素的值加 1。假設 p 指向第 0  個元素,并且第 0 個元素的值為 99,執行完該語句后,第 0  個元素的值就會變為 100。

以上就對C語言 數組指針的資料整理,后續繼續補充相關知識,謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 成人小视频在线观看 | 成人av免费| 国内自拍网站 | 一本久久a久久精品亚洲 | 日韩中文字幕在线播放 | 爱干在线 | 国产精品国产三级国产aⅴ原创 | 精品国产乱码久久久久久影片 | 久久亚| 一区二区三区精品视频免费看 | 久久一区| 精品麻豆剧传媒av国产九九九 | 在线观看一级黄色片 | 日韩综合 | 中文字幕在线电影观看 | 久久综合久久综合久久综合 | 黄色在线免费 | 欧美综合婷婷 | 久久久久香蕉视频 | 亚洲一区二区国产 | 九九九久久国产免费 | 亚洲国产精品99久久久久久久久 | 成人午夜毛片 | 午夜男人视频 | 精品在线一区二区三区 | 国产欧美日韩综合精品一区二区 | 国产成人综合网 | 国产成人99久久亚洲综合精品 | 中文字幕精品一区二区三区精品 | 日干夜操| 欧洲精品码一区二区三区免费看 | 国外精品久久久蜜桃免费全文阅读 | 一本大道色卡1卡2卡3 | 欧美一区二区三区的 | 日韩国产中文字幕 | 俺来也俺也啪www色 性色视频在线 | 欧美精品在线视频 | 色综合网址 | 欧美激情久久久 | 日韩国产一区二区三区 | 免费a级毛片大学生免费观看 |