【C語言入門級教學】字符指針變量

文章目錄

  • 1.字符指針變量
  • 2. 數組指針變量
    • 2.1 數組指針變量初始化
  • 3.?維數組傳參的本質

1.字符指針變量

在指針的類型中我們知道有?種指針類型為字符指針 char* ;

?般使?:

int main() 
{ char ch = 'w'; char* pc= &ch;//pc的類型是char**pc='w';//對pc解引用 修改ch存放的內容return 0; 
} 

另一種使用方法:

int main() 
{ const char* pc="abcdef";//"abcdef"是常量字符串不可被修改,所以加上const更完整更嚴謹//pc存放的是首字符a的地址//char arr[]="abcdef";//用數組可以被修改//char* pc=arr;printf("%c\n",*pc);printf("%s\n",pc);//按照起始位置打印return 0; 
} 

代碼const char* pc=“abcdef”;特別容易讓同學以為是把字符串abcdef放到字符指針pc?了,但是本質是把字符串abcdef?字符的地址放到了pc中

《劍指offer》中收錄了?道和字符串相關的筆試題,我們?起來學習?下:

#include <stdio.h>  
int main() 
{ char str1[] = "hello bit."; char str2[] = "hello bit."; const char *str3 = "hello bit."; const char *str4 = "hello bit."; if(str1 ==str2) printf("str1 and str2 are same\n"); else printf("str1 and str2 are not same\n");  if(str3 ==str4) printf("str3 and str4 are same\n"); else printf("str3 and str4 are not same\n");  return 0; 
} 

前置知識:這里比較的是地址,strcmp()才是用來比較字符串的內容

這?str3和str4指向的是?個同?個常量字符串。C/C++會把常量字符串存儲到單獨的?個內存區域,==當?個指針指向同?個字符串的時候,他們實際會指向同?塊內存。==但是?相同的常量字符串去初始化不同的數組的時候就會開辟出不同的內存塊。所以str1和str2不同,str3和str4相同。

2. 數組指針變量

2.1 數組指針變量初始化

? 整形指針變量: int * pint; 存放的是整形變量的地址,能夠指向整形數據的指針。

? 浮點型指針變量: float * pf; 存放浮點型變量的地址,能夠指向浮點型數據的指針。

類比得到數組指針變量應該是:存放的應該是數組的地址,能夠指向數組的指針變量。

那怎么獲得數組的地址呢?就是我們之前學習的&數組名

int arr[10] = {0}; 
&arr;//得到的就是數組的地址 

如果要存放個數組的地址,就得存放在數組指針變量中,如下:

int(*p)[10] = &arr;

我們調試也能看到 &arr 和 p 的類型是一樣的,都是int(*)[10]

演示如下:

int main()
{int arr[10]={0};//arr=&arr[0]是首元素地址//int* p=arr;存的是首元素地址 類型是int*//這里的p是整型指針變量int (* p)[10]=&arr;//取出的是整個數組的地址 類型是int(*)[10]//p是數組指針變量//存放的是數組的地址//p指向的是數組arrreturn 0;
}

解釋:p先和* 結合,說明p是?個指針變量,然后指針指向的是?個??為10個整型的數組。所以p是?個指針,指向?個數組,叫數組指針。

這?要注意:[]的優先級要?于* 號的,所以必須加上()來保證p先和*結合。

數組指針類型解析:

int    (*p) [10] = &arr; 
|       |     | 
|       |     | 
|       | p指向數組的元素個數
|     p是數組指針變量名 
p指向的數組的元素類型          

1.那么如果p指向一個字符指針數組

int main()
{char* arr[5];char* (*p)[5]=&arr;return 0}

2.如何用數組指針的到數組的元素

int main()
{int arr[]={1,2,3,4,5,6,7,8,9};int (*p)[10]=&arr;int i=0;for(i=0;i<10;i++){printf("%d ",(*p)[i]);//這里的p相當于&arr//p是數組指針//*p得到整個數組//(*p)[i]用下標獲得數組的某個元素}return 0;
}

這個方法還是有點復雜,使用簡單的方法就行如下:

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

3.?維數組傳參的本質

有了數組指針的理解,我們就能夠講?下?維數組傳參的本質了。 過去我們有?個?維數組的需要傳參給?個函數的時候,我們是這樣寫的:

#include <stdio.h>  
void test(int a[3][5], int r, int c)
{ int i = 0; int j = 0; for(i=0; i<r;i++){for(j=0; j<c;j++){printf("%d ", a[i][j]); } printf("\n"); } 
} 
int main() 
{ int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7}}; test(arr, 3, 5); return 0; 
}

淺淺的補充一個知識

int a[3][5]可以省略行數寫成int a[][5]//因為電腦得到的是地址,不會真的創建一個二維數組,寫清楚行數是使你自己知道,地址還是一個挨著一個存放

這?實參是?維數組,形參也寫成?維數組的形式,那還有什么其他的寫法嗎?

?先我們再次理解?下?維數組,?維數組其實可以看做是每個元素是?維數組的數組,也就是?維數組的每個元素是?個?維數組。那么?維數組的?元素就是第??是個?維數組

所以,根據數組名是數組?元素的地址這個規則,?維數組的數組名表?的就是第??的地址,是?維數組的地址。根據上?的例?,第??的?維數組的類型就是 int [5] ,所以第??的地址的類型就是數組指針類型 int(*)[5] 。那就意味著?維數組傳參本質上也是傳遞了地址,傳遞的是第??這個?維數組的地址,那么形參也是可以寫成指針形式的。

如下:

#include <stdio.h>  
void test(int (*p)[5], int r, int c)//p存放的是一維數組的地址 
{ int i = 0; int j = 0; for(i=0; i<r;i++){for(j=0; j<c;j++){printf("%d ", *(*(p+i)+j));//printf("%d ",p[i][j]);//p+i是arr[i]這行的首元素地址,取地址得到首元素,加j跳過j個元素得到arr[i]這行j列元素的地址,再取地址} printf("\n"); } 
} 
int main() 
{ int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7}}; test(arr, 3, 5);//實參是二維數組  return 0; 
}

總結:?維數組傳參,形參的部分可以寫成數組,也可以寫成指針形式。

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

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

相關文章

【Shell腳本自動化編寫——報警郵件,檢查磁盤,web服務檢測】

Shell腳本自動化編寫Shell腳本自動化編寫一、判斷當前磁盤剩余空間是否有20G&#xff0c;如果小于20G&#xff0c;則將報警郵件發送給管理員&#xff0c;每天檢查一次磁盤剩余空間。第一步&#xff1a;準備工作第二步&#xff1a;配置郵件信息第三步&#xff1a;檢查磁盤的自動…

Java 接口(下)

三、接口的繼承性【基礎重點】 1. Java中的接口之間的繼承關系是多繼承&#xff0c;一個接口可以有多個父接口(1) 語法&#xff1a;interface 接口名 extends 父接口1,父接口2{} 2. 類和接口之間是多實現的關系&#xff1a;一個類可以同時實現多個接口(1) 語法&#xff1a;clas…

學習游戲制作記錄(各種水晶能力以及多晶體)8.1

1.實現創建水晶并且能與水晶進行交換位置的能力創建好水晶的預制體&#xff0c;添加動畫控制器&#xff0c;傳入待機和爆炸的動畫創建Crystal_Skill_Control腳本&#xff1a;掛載在水晶預制體上private float crystalExstTime;//水晶存在時間public void SetupCrystal(float _c…

在vscode 如何運行a.nut 程序(Squirrel語言)

在 VS Code 中運行 Squirrel 語言編寫的 .nut 程序&#xff0c;需要先配置 Squirrel 運行環境并安裝相關插件&#xff0c;具體步驟如下&#xff1a; 一、安裝 Squirrel 解釋器 Squirrel 程序需要通過其官方解釋器 squirrel 或 sq 執行&#xff0c;首先需要安裝解釋器&#xf…

【數據結構】生活中的數據結構:從吃飯與編程看棧與隊列思維

生活中的數據結構&#xff1a;從吃飯與編程看棧與隊列思維 在軟件開發的世界里&#xff0c;棧&#xff08;Stack&#xff09;和隊列&#xff08;Queue&#xff09;是兩種基礎的數據結構&#xff0c;它們以不同的順序管理數據&#xff1a;棧遵循后進先出&#xff08;LIFO&#x…

牛客——接頭密匙

題目鏈接&#xff1a;牛客--接頭密匙 該題是一個很顯然的前綴樹問題&#xff0c;只需要構建a中所有數組對應的前綴樹&#xff0c;之后求b所處前綴個數即可。關于前綴樹的構建&#xff0c;可以觀看左老師算法講解045的視頻&#xff0c;簡單來講就是用特殊字符將實際數據隔開&…

【Linux基礎知識系列】第六十三篇 - 文件編輯器基礎:vim

在 Linux 系統中&#xff0c;文本編輯器是系統管理員和開發人員不可或缺的工具。vim 是一個功能強大的文本編輯器&#xff0c;廣泛應用于 Linux 系統中。它支持多種編輯模式&#xff0c;提供了豐富的文本編輯功能&#xff0c;適用于編寫代碼、配置文件和文檔。掌握 vim 的基本使…

音頻驅動的視覺特效:粒子、動畫與Shader的融合技術

音頻驅動視覺效果的實現與應用1. 引言在互動媒體、游戲和數字藝術領域&#xff0c;音頻數據實時控制視覺元素已成為核心技術&#xff0c;它能創造沉浸式體驗&#xff0c;增強用戶參與感。例如&#xff0c;音樂會可視化或VR游戲中&#xff0c;音頻信號驅動粒子流動、動畫變化和S…

機器學習環境配置

【終極指南】吃透機器學習環境配置&#xff1a;從Conda、CUDA到Docker容器化 大家好&#xff01;在機器學習的旅程中&#xff0c;一個穩定、可復現的環境是成功的基石。 第一部分&#xff1a;核心理念——為何環境配置如此重要&#xff1f; 任何機器學習模型的運行&#xff0c;…

【14】大恒相機SDK C#開發 ——Bitmap.UnlockBits()什么意思?有什么用?bmpData.Scan0;什么意思?有什么用?

文章目錄1 Bitmap.UnlockBits()2 bmpData.Scan01 Bitmap.UnlockBits() 在 C# 中&#xff0c;Bitmap.UnlockBits() 方法的作用是解鎖通過 Bitmap.LockBits() 方法鎖定的位圖數據&#xff0c;并釋放相關的位圖數據結構。 當你使用 Bitmap.LockBits() 方法鎖定位圖數據時&#x…

什么是doris

文章目錄簡介使用場景Apache Doris 主要應用于以下場景&#xff1a;實時數據分析&#xff1a;湖倉融合分析&#xff1a;半結構化數據分析&#xff1a;Apache Doris 的核心特性詳細請看官方文檔&#xff1a; Apache Doris介紹簡介 Apache Doris 是一款基于 MPP 架構的高性能、實…

python+pyside6的簡易畫板

十分簡單的一個畫板程序&#xff0c;用QLabel控件作為畫布&#xff0c;在畫布上可以畫出直線、矩形、填充矩形、園&#xff0c;橢園、隨手畫、文本等內容。將原先發布的畫板程序中的畫文本方法修改成了原位創建一編輯框&#xff0c;編輯框失去焦點后&#xff0c;即將文本畫在畫…

【數據可視化-76】從釋永信被查,探索少林寺客流量深度分析:Python + Pyecharts 炫酷大屏可視化(含完整數據和代碼)

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

WPF TreeView自帶自定義滾動條

放在TreeView.Resources中&#xff1a;<Style TargetType"ScrollBar"><Setter Property"Stylus.IsPressAndHoldEnabled" Value"false"/><Setter Property"Stylus.IsFlicksEnabled" Value"false"/><Set…

MongoDB 詳細用法與 Java 集成完整指南

MongoDB 詳細用法與 Java 集成完整指南 目錄 MongoDB 基礎概念MongoDB 安裝與配置MongoDB Shell 基本操作Java 環境準備Java MongoDB 驅動集成連接配置基本 CRUD 操作高級查詢操作索引操作聚合管道事務處理Spring Boot 集成最佳實踐 1. MongoDB 基礎概念 1.1 核心概念對比 …

【Flutter3.8x】flutter從入門到實戰基礎教程(四):自定義實現一個自增的StatefulWidget組件

fluttet中實現一個自定義的StatefulWidget組件&#xff0c;可以在數據變化后&#xff0c;把最新的頁面效果展示給客戶 實現效果實現代碼 pages文件夾下新加一個counter_page.dart文件 class CounterPage extends StatefulWidget {const CounterPage({super.key});overrideState…

[AI8051U入門第十三步]W5500實現MQTT通信

前言 學習目標: 1、學習MQTT協議 2、了解MQTT數據幀格式 3、自己編寫MQTT程序 4、調試MQTT程序一、MQTT協議介紹 MQTT(Message Queuing Telemetry Transport) 是一種輕量級的 發布/訂閱(Pub/Sub) 消息傳輸協議,專為 低帶寬、高延遲或不可靠網絡 環境設計,廣泛應用于 物…

四、基于SpringBoot,MVC后端開發筆記

整合第三方技術&#xff1a; 1、整合Junit (1)名稱&#xff1a;SpringBootTest (2)類型&#xff1b;測試類注解 (3)位置&#xff1a;測試類定義上方 (4)作用&#xff1a;設置Junit加載的SpringBoot啟動類 (5)相關屬性&#xff1a;classes&#xff1a;設置SpringBoot啟動類 2、整…

深入講講異步FIFO

一、異步 FIFO 的基本概念1.1 定義與核心作用異步 FIFO&#xff08;Asynchronous FIFO&#xff09;是一種讀寫時鐘完全獨立的先進先出&#xff08;First-In-First-Out&#xff09;數據緩沖器&#xff0c;主要用于跨時鐘域數據傳輸場景。在數字系統中&#xff0c;當兩個模塊工作…

linux81 shell通配符:[list],‘‘ ``““

shell 文件處理工具 grep 別名顯示顏色 grep --colorauto ‘root’ passwd alias grep‘grep --colorauto’ vim /etc/bashrc alias grep‘grep --colorauto’ source /etc/bashrc [rootsamba tmp]# grep --colorauto root 2.txt root:x:0:0:root:/root:/bin/bash operator:x:1…