C語言學習記錄(十二)——指針與數組及字符串

文章目錄

  • 前言
  • 一、指針和數組
  • 二、指針和二維數組
    • **行指針(數組指針)**
  • 三、 字符指針和字符串
  • 四、指針數組


前言

一個學習嵌入式的小白~ 有問題評論區或私信指出~


提示:以下是本篇文章正文內容,下面案例可供參考

一、指針和數組

  • 在C語言中 ,數組的指針是指數組在內存中的起始地址,數組元素的地址是指數組元
    素在內存中的起始地址。
  • 一維數組的數組名為一維數組的指針(起始地址)

例如:

		double x[8]; //x為數組的起始地址double *p;p = x;

設指針變量px的地址值等于數組指針x(即指針變量px指向數組的首元素),則:
x[i] 、 (px+i)、(x+i) 和px[i]具有完全相同的功能:訪問數組的第i+1個數組元素

int a[10], *p ; p=a;

在這里插入圖片描述

p[i] <==> *(p+i)

  • 注意:
    • 指針變量和數組在訪問數組中元素時,一定條件下其使用方法具有相同的形式,因為
      指針變量和數組名都是地址量
    • 但指針變量和數組的指針(或叫數組名)在本質上不同,指針變量是地址變量,而數
      組的指針是地址常量

數組名是地址常量
p++ ,p-- (對)
a++, a-- (錯)
a+1 ,*(a+2) (對)

題目:數組反序存放

#include <stdio.h>void swap(int *p1,int *p2);//交換函數
void swaparr(int arr[],int lenth);//數組為形參
void swapprr(int *arr,int lenth);//指針為形參int main()
{int arr[10];for(int i = 0;i<10;i++)//循環輸入數組中的元素{scanf("%d",&arr[i]);}swapprr(arr,10);//進行數組反序for(int i = 0;i<10;i++)//遍歷反序之后的數組{printf("%d ",arr[i]);}return 0;}
void swap(int *p1,int *p2)//交換函數
{int temp;temp = *p1;*p1 = *p2;*p2 = temp;
}
void swaparr(int arr[],int lenth)反序函數
{for(int i=0;i<=((lenth-1)/2);i++){swap(&arr[i],&arr[lenth-1-i]);}
}	 void swapprr(int *arr,int lenth)
{for(int i=0;i<=((lenth-1)/2);i++){swap((arr+i),(arr+lenth-1-i));}
}

二、指針和二維數組

多維數組就是具有兩個或兩個以上下標的數組
在C語言中 ,二維數組的元素連續存儲,按行優先存
在這里插入圖片描述

題目:一級指針遍歷二維數組

#include <stdio.h>
#include <stdlib.h>int main()
{int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}};int *p,i;p = arr;for(i = 0;i < 9;i++){printf("%d ",*(p+i));}return 0;}

可以把二維數組看作由多個一維數組組成。
比如ina a[3][3] ,含有三個元素,a[0],a[1],a[2]
元素a[0],a[1],a[2]都是一維數組名
二維數組名代表數組的起始地址,數組名加1,是移動一行元素。因此,二維數組名常被
稱為行地址。
在這里插入圖片描述

行指針(數組指針)

存儲行地址的指針變量,叫做行指針變量,形式如下:

  • <存儲類型> <數據類型> (*<指針變量名>){ 表達式n };
  • 例如:
		int  a[2][3] ;   int (*p)[3];

方括號中的常量表達式表示指針加1,移動幾個數據。
當用行指針操作二維數組時,表達式一般寫成1行的元素個數,即列數。

題目:使用行指針表示二維數組的某個元素

#include <stdio.h>
#include <stdlib.h>int main()
{int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}};int (*p)[3],i,j;p = arr;for(i = 0;i < 3;i++)for(j = 0;j < 3;j++)printf("%d ",*(*(p+i)+j));return 0;}

三、 字符指針和字符串

  • C語言通過使用字符數組來處理字符串
  • 通常,我們把char數據類型的指針變量稱為字符指針變量。字符指針變量與字符有著
    密切關系,他也被用來處理字符串。
  • 初始化字符指針是把內存中字符串的首地址賦予指針,并不是把該字符串復制到指針
    中。
	char  str[] = "Hello World";char *p  = str;
  • 在C語言編程中,當一個字符指針指向一個字符串常量時,不能修改指針指向的對象
    的值
	char *p = "Hello World"*p  = 'h';

題目:不使用任何字符串函數,實現字符串函數連接功能

#include <stdio.h>
#include <stdlib.h>int Mystrlen(char *p);
int main()
{char a[100],b[100],c[100];char *p;p = c;int l1,l2;printf("please input first string:");gets(a);printf("please input conented string:");gets(b);l1 = Mystrlen(a);l2 = Mystrlen(b);for(int i = 0 ; i<(l1+l2) ; i++){if(i < l1){p[i] = a[i];}else{p[i] = b[i-l1];}if( i == (l1+l2-1)){p[i+1] = '\0';}}printf("%s\n",c);return 0;
}
int Mystrlen(char *p)
{int n = 0;for(int i = 0 ; i < 100 ; i++){if(p[i] != '\0'){n++;}else{return n;}}return n;
}

四、指針數組

所謂指針數組是指由若干個具有相同存儲類型和數據類型的指針變量構成的集合
指針數組的一般說明形式:

  • <存儲類型 > <數據類型> *<指針數組名> [<大小>]
  • 指針數組名表示該指針數組的起始地址
    聲明一個指針數組
double *pa2[2] , a[2][3];

把一維數組a[0] 和 a[1]的首地址分別賦予指針變量數組的數組元數pa[0] 和pa[1];

pa[0] = a[0]; //等價于pa[0] = &a[0][0]
pa[1] = a[1]; //等價于pa[1] = &a[1][0]

此時pa[0]指向了一維數組a[0]的第一個元素,而pa[1]指向了一維數組a[1]的第一個元素。

題目:使用指針數組處理二維數組,求出二維數組所有元素的和。

#include <stdio.h>
#include <stdlib.h>int main()
{int arr[][3] = {{1,2,3},{4,5,6},{7,8,9}};int *pa[3];int i,j,sum = 0;for(i = 0;i < 3;i++){pa[i] = arr[i];}for(i = 0;i < 3;i++)for(j = 0;j < 3;j++)sum += *(pa[i]+j);printf("%d",sum);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39860.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39860.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39860.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【vscode插件】多行注釋

最近在編寫C程序的過程中&#xff0c;筆者發現&#xff0c;vscode默認的多行注釋是使用單行注釋拼起來的&#xff0c;對于筆者想要突出多行注釋&#xff0c;同時便于后續修改的需求無法滿足&#xff0c;隨體驗一下自己開發VSCODE插件。 可以說&#xff0c;整個插件的開發和上線…

軟件開發生命周期(Software Development Life Cycle, SDLC)

目錄 簡介 簡介 軟件開發生命周期&#xff08;Software Development Life Cycle, SDLC&#xff09;是軟件從概念到正式交付和維護的一系列階段。每個階段都有其特定的目標和活動&#xff0c;以下是軟件開發生命周期中常見的幾個階段&#xff1a; 需求收集與分析&#xff08;R…

IndexError: image index out of range

IndexError: image index out of range 這個錯誤通常意味著你嘗試訪問的圖像索引超出了圖像的實際尺寸范圍。在你給出的代碼行&#xff1a; s_img_point_color_list.append(s_pixels[coordinate[0], coordinate[1]])你正在嘗試從 s_pixels 這個變量&#xff08;很可能是一個圖…

Android系統為什么lmkd殺到adj 100就代表有低內存?

在Android系統中&#xff0c;lmkd&#xff08;Low Memory Killer Daemon&#xff0c;低內存終止守護進程&#xff09;負責監控系統的內存狀態&#xff0c;并在內存壓力較高時通過終止不必要的進程來釋放內存&#xff0c;以維持系統的穩定運行。關于lmkd為何在殺到adj&#xff0…

Nginx負載均衡及動靜分離

目錄 一、Nginx負載均衡【重點】 1.1 輪詢 1.2 權重 1.3 ip_hash 二、Nginx動靜分離【重點】 2.1 動態資源代理 2.2 靜態資源代理 官方文檔 nginx 一、Nginx負載均衡【重點】 Nginx為我們默認提供了三種負載均衡的策略&#xff1a; 輪詢&#xff1a;將客戶端發起的請求…

【chatgpt】pytorch中requires_grad=True

在 PyTorch 中&#xff0c;requires_gradTrue 是一個非常重要的標志&#xff0c;它指示 PyTorch 是否需要為某個張量計算梯度。這在訓練神經網絡時尤為關鍵&#xff0c;因為我們通常需要通過反向傳播來更新模型參數&#xff0c;以最小化損失函數。 requires_gradTrue 的作用 …

Perl變量作用域全解析:掌握變量的可見之旅

Perl變量作用域全解析&#xff1a;掌握變量的可見之旅 Perl是一種靈活的腳本語言&#xff0c;以其對文本處理的強大能力而聞名。在Perl編程中&#xff0c;變量作用域的概念至關重要&#xff0c;它決定了變量在代碼中的可見性和生命周期。本文將深入探討Perl中變量作用域的定義…

AI降重,不再難:降AI率的實用技巧大揭秘

如何有效降低AIGC論文的重復率&#xff0c;也就是我們說的aigc如何降重&#xff1f;AIGC疑似度過高確實是個比較愁人的問題。如果你用AI幫忙寫了論文&#xff0c;就一定要在交稿之前做一下AIGC降重的檢查。一般來說&#xff0c;如果論文的AIGC超過30%&#xff0c;很可能會被判定…

CAS操作

CAS 全稱:Compare and swap,能夠比較和交換某個寄存器中的值和內存中的值,看是否相等,如果相等,則把另外一個寄存器中的值和內存進行交換. (這是一個偽代碼,所以這里的&address實際上是想要表示取出address中的值) 那么我們可以看到,CAS就是這樣一個簡單的交換操作,那么…

基于SpringBoot房屋租賃管理系統設計和實現(源碼+LW+調試文檔+講解等)

&#x1f497;博主介紹&#xff1a;?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者&#xff0c;博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?&#x1f497; Java精品實戰案例《1000套》 2025-2026年最值得選擇的Java畢業設計選題大全&#xff…

TVBox自定義配置+軟件密碼版本

apk地址 : https://gitee.com/wheat-wheat/kekeda-duck-apk 1、安裝安卓SDK Android SDK Windows 安裝及環境配置教程_sdk manager windows-CSDN博客 修改點: 基礎配置: java版本:

在系統已經存在postgres時,安裝gitlab

以下作廢&#xff0c;感覺直接裝gitlab太不穩定了&#xff0c;現在轉而使用dockers安裝gitlab https://cloud.tencent.com/developer/article/2309562 https://www.cnblogs.com/lvzhenjiang/p/14949722.html https://cloud.tencent.com/developer/article/2256871 https://blo…

新火種AI|國產大模型展開決戰,是資本游戲還是技術革命?

作者&#xff1a;一號 編輯&#xff1a;美美 資本角逐與技術革新&#xff0c;國產大模型的雙線戰場已然開啟。 隨著人工智能技術的不斷進步&#xff0c;國產大模型正迅速成為行業關注的焦點。在這個由數據驅動的時代&#xff0c;資本的注入和技術創新的加速&#xff0c;讓國…

Spring Cloud中的服務路由與過濾技術實現

Spring Cloud中的服務路由與過濾技術實現 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在微服務架構中&#xff0c;服務路由與過濾是確保服務之間通信有效性和安全性的重要技術。Spring Cloud作為…

Python28-6 隨機森林

隨機森林算法詳細介紹 1. 理論背景 隨機森林&#xff08;Random Forest&#xff09;是一種由Leo Breiman和Adele Cutler在2001年提出的集成學習方法。它結合了多個決策樹的預測結果&#xff0c;以提高模型的準確性和魯棒性。 2. 算法細節 隨機森林的構建過程可以分為以下幾…

Qt——升級系列(Level Eight):界面優化

目錄 QSS 背景介紹 基本語法 QSS設置方式 指定控件樣式設置 全局樣式設置 從文件加載樣式表 使用Qt Designer 編輯樣式 選擇器 選擇器概況 子控件選擇器 偽類選擇器 樣式屬性 盒模型 控件樣式示例 按鈕 復選框、單選框 輸入框 列表 菜單欄 登錄界面 繪圖 基本概念 繪制各種形…

[Go 微服務] Kratos 使用的簡單總結

文章目錄 1.Kratos 簡介2.傳輸協議3.日志4.錯誤處理5.配置管理6.wire 1.Kratos 簡介 Kratos并不綁定于特定的基礎設施&#xff0c;不限定于某種注冊中心&#xff0c;或數據庫ORM等&#xff0c;所以您可以十分輕松地將任意庫集成進項目里&#xff0c;與Kratos共同運作。 API -&…

Linux內網端口轉公網端口映射

由于服務商做安全演練&#xff0c;把原先服務器內網的端口映射到外網端口全都關閉了&#xff0c;每次維護服務器特別麻煩&#xff0c;像數據庫查詢如果用原生的mysql 去連接&#xff0c;查詢返回的結果亂了&#xff0c;非常不方便。 查了服務還是可以正常訪問部分外網的&#x…

知識圖譜查詢語言的表示

文章目錄 SPARQL知識圖譜查詢基本構成常見的SPARQL查詢算子語義Markup表示語言SPARQL知識圖譜查詢基本構成 RDF 支持類似數據庫的查詢語言,叫作SPARQL,它提供了查詢RDF 數據的標準語法、處理SPARQL查詢的規則以及結果返回形式。 變量,RDF中的資源,以“?”或者“$”指示;…

【chatgpt】pytorch的全連接層FC

文章目錄 創建全連接層全連接層&#xff08;線性層&#xff09;使用 PyTorch 定義全連接層1. 定義一個全連接層2. 查看層的參數3. 使用全連接層 示例&#xff1a;構建一個簡單的神經網絡總結 打印FC參數輸出解釋完整代碼示例示例輸出總結 線性層的參數和屬性線性層的參數和屬性…