Day 09

文章目錄

    • 指針數組
    • 指針和函數
    • 技術名詞解釋
    • 技術細節
    • 課堂筆記

指針數組

#include<stdio.h>
int main()
{int a[3] = {0,1,2};//指針數組,它是數組,每個元素都是指針int *p[3];p[0] = &a[0];p[0] = a;p[1] = &a[1];p[1] = a+1;p[2] = &a[2];p[2] = a+2;//sizeof(p):3個元素,int*(32位)//3 * 4 = 12//sizoef(p[0]):第0給元素,int * = 4int n = sizeof(p)/sizeof(p[0]);int i =0;for(i = 0;i < n;i++){p[i] = &a[i]; //a+i}for(i = 0;i < n;i++){//printf("%d\n",*p[i])printf("%d\n", *(*(p+i)));//p[i]等價于*(p+i)}return 0;
}

指針和函數

通過函數交換兩個變量

#include<stdio.h>
void swap(int m, int n)
{int tmp;tmp = m;m = n;n = tmp;printf("m = %d,n = %d\n",m,n);
}
int main()
{       int a = 11;int b = 22;swap(a,b);//值傳遞printf("a = %d,b = %d\n",a,b);return 0;
}     

地址傳遞

#include<stdio.h>
void swap(int *m, int *n)
{int tmp;tmp = *m;*m = *n;*n = tmp;
}
int main()
{int a = 11;int b = 22;//值傳遞,不管這個變量什么類型,只要是變量本身傳遞,就是值傳遞//swap(a,b);//值傳遞swap(&a,&b);  //地址傳遞,變量的地址printf("a = %d,b = %d\n",a,b);return 0;
}

?形參中的數組01

#include<stdio.h>
int main()
{int a[] = {1,-2,3,-4,5,-6,7,-8,9};int i = 0;int n = sizeof(a)/sizeof(*a);printf("排序前\n");for(i = 0;i < n;i++){printf("%d ", a[i]);}printf("\n");//冒泡排序int j = 0;int tmp;for(i = 0;i < n-1;i++){for(j = 0;j < n-i-1;j++){       if(a[j] > a[j+1])  //升序{tmp = a[j];a[j] = a[j+1];a[j+1] = tmp;}}}printf("排序后\n");for(i = 0;i < n;i++){printf("%d ", a[i]);}printf("\n");

形參中的數組02

#include<stdio.h>
//1、形參中的數組,不是數組,它是普通指針變量
//2、形參數組:int a[100000],int a[],int *a對編譯器而已,沒有任何區別
//3、編譯器都是當做int*處理
//4、形參中的數組和非形參數組區別:形參中的數組是指針變量,非形參數組就是數組
//void print array(int a[100000])
//void print array(int a[])
void print_array(int a[], int n)
{int i = 0;//64位系統,sizeof(a),a是指針變量,結果為8//sizeof(a[0])第0個元素,是int類型,結果為4/*int n = sizeof(a)/sizeof(a[0]);printf("sizeof(a) = %d\n". sizeof(a));printf("sizeof(a[0] = %d\n),sizeof(a[0])");*/for(i = 0;i < n;i++){printf("%d, ",a[i]); //等價于*(a + i)}printf("\n");//a = NULL;   //形參中的數組,不是數組,它是普通指針變量        
}
int main()
{int a[] = {1,-2,3,-4,5,-6,7,-8,9};//print_array(a);  //傳遞的是,數組的首元素地址,&a[0]//a = NULL;int n = sizeof(a)/sizeof(*a);print_array(a,n); //應該把數組元素個數傳遞過去return 0;
}

?返回局部變量的地址

#include<stdio.h>
int *fun()
{int a;  //Linux64位,不允許返回局部變量的地址return &a;
}
int main()
{int *p = NULL;p = fun(); //接受函數返回的地址    //到上一步使用完fun(),fun()內的a,自動釋放,下面操作野指針*p = 100; //操作指針所指向的內存return 0;
}

返回全局變量的地址

#include <stdio.h>int a; // 明確注釋全局變量的用途int *fun() {return &a; // 函數名更明確
}int main() {int *p = fun();*p = 100;printf("*p = %d, a = %d\n", *p, a); // 合并輸出*(fun()) = 111;printf("a = %d\n", a);return 0;
}

指針和字符串

字符串打印說明

#include<stdio.h>
int main()
{char str[] = "hello mike";//1、%s,從首元素開始打印,直到結束符位置//2、%s,操作的是指針所指向的內容//printf("str = %s\n", str);//2、str是首元素地址,如果想打印str本身的值,%p,&x,&d,%oprintf("str = %p\n",str);  //一個個打印出來,地址//3、str代表第0個元素,它是char//printf("str3 = %s\n", *str);printf("str3 = %c\n", *str);int i = 0;while(str[i] != '\0')  //while(*(str+i) != '\0')){printf("%c",str[i]);i++;}printf("\n");return 0;
}

字符指針

#include<stdio.h>
int main()
{char str[] = "hello";str[0] = '1';*(str + 1) = '2';//printf("str = %s\n", str);  //12lloprintf("str = %s\n",&str[0] +1); //2lloprintf("str = %s\n",str+1); //2llo//定義一個指針,指向首元素char *p = NULL;p  = &str[0];p  = str; //數組名就是首元素地址*p = 'a';p++;  //p = p +1 *p = 'b';printf("str = %s\n", str); //ablloprintf("str = %s\n", p);  // &str[0]+1 //blloprintf("str = %s\n",p-1);return 0;
}

字符串拷貝問題

#include<stdio.h>
#include<string.h>
int main()
{char buf[100];char *p = buf;//1、p指向buf的首元素//2、strcpy()是給p所指向的內存拷貝內容,字符串拷貝了bufstrcpy(p,"hello mike abc");printf("p = %s, buf = %s\n",p,buf);return 0;
}
int main01()
{char *p;//1、不是給p變量拷貝內容//給p所指向的內存拷貝內容//3、P是野指針,給野指針所指向的內存拷貝內容,結果導致段錯誤strcpy(p, "hello mike abc");return 0;
}

?字符串拷貝函數

#include<stdio.h>
//void my_strcpy(char dst[].char src[])
void my_strcpy(char *dst, char *src)
{int i = 0;while(*(src+i)!='\0'){*(dst+i) = *(src+i);i++}//結束符*(dst + i) = 0;
int main()
{       char src[] = "hello mike";char dst[100];char *p = buf;my_strcpy(p,src);  //自定義拷貝函數printf("dst = %s\n",dst);return 0;
} 

const修飾的字符指針?

#include<stdio.h>
int main()
{char buf[] = "hello";char *p1 = buf;*p1 = 'a'; //改變指針所指向的內存p1 = NULL;//改變指針變量本身//const修飾*,指針所指向的內存不能修改const char *p2 = buf;//*p2 = 'a'; //errp2 = NULL; //okreturn 0;
}     

?字符串常量

#include<stdio.h>
void fun()
{printf("fun s2 = %p\n","hello mike");
}
int  main()
{//1、每個字符串都是一個地址,這個地址是指字符串首元素地址//2、字符串常量放在data區,文字常量區printf("s1 = %s\n","hello mike");printf("s2 = %s\n","hello mike");printf("s3 = %s\n","hello mike"+1);//fun();return 0;
}

?文字常量區不允許修改01

#include<stdio.h>
#include<string.h>
int main()
{//1、字符串常量就是字符串的首元素地址printf("s1 = %p\n","hello mike");char *p1 = "hello mike";printf("p1 = %p\n",p1);char *p2 = "hello mike";printf("p2 = %p\n",p2);//2、字符串常量,文字常量區的字符串,只讀,不能修改printf("*p1 = %c\n",*p1); //讀,ok//3、p1指向字符串常量,字符串常量為只讀,不能修改//*p1 = 'a'; //修改 //errchar *p3 = "hello";//4、p3指向文字常量區,不能改strcpy(p3,"abc"); //errreturn 0;
}

??文字常量區不允許修改02

#include<stdio.h>
void fun(char *tmp)
{*tmp = 'a'; //err
}                   
int main()
{char *p = NULL; //p是變量"hello mike" //字符串常量,首元素地址p = "hello mike"; //p指向字符串//*p = 'a'; //err,指向文字區常量,文字常量區內容只讀p = NULL; //okp = "hello"  //okchar *p2 = "abc";fun(p2); //p2的值,是“abc”首元素地址return 0;
} 

字符串常量初始化問題

#include<stdio.h>
int main()
{       //1、p指針保存了“hello”的地址//2、指針所指向的內存不能修改char *p = "hello";//1、把"hello"一個一個字符放在buf數組中//2、數組的元素可以修改char buf[] = "hello";return 0;
} 

main形參使用說明?

#include<stdio.h>//argv[]:它是數組,數組每個元素都是char*,每個元素都是字符地址
//argc:argv[]元素個數
//main()函數參數,需要用戶傳遞
int main(int argc,char *argv[])
{int i =0;for(i = 0;i < argc;i++){printf("test = %s\n",argv[i]);}return 0;
}

?字符指針數組

#include<stdio.h>
//void fun(int a[])
//void fun(int a[100])
void fun()
{
}//void print_array(char * p[100],int n)
void print_array(char *p[], int n)
//void print_arrauy(char **p, int n)
{int i = 0;for(i = 0;i < n;i++){printf("%s\n",p[i]);}
}
int main()
{char *p1 = "hello";char *p2 = "abc";char *p3 = "mike";char *p[] = {"hello", "abc", "mike"};int n = sizeof(p)/sizeof(*p);int i = 0;for(i = 0;i < n;i++){printf("%s\n", p[i]);}return 0;
}

查找匹配字符串出現的次數


#include<stdio.h>
#include<string.h>
int main()
{char *p = "11abcd11122abcd333abcd3322abcd3333322qqq";int i = 0; //累加器char *tmp = NULL;while(1){//查找匹配字符串,如果找到,返回匹配字符串的地址,沒有找到返回空tmp = strstr(p, "abcd");if(tmp == NULL){break;  //跳出循環}else //找到{i++; //累加//重新設置新的起點p = tmp + strlen("abcd");}}printf("出現abcd的次數為; %d\n", i);return 0;
}

兩頭堵類型

#include<stdio.h>
#include<string.h>
int main()
{char *p = "  123456789   ";char *start = p; //首元素地址char *end = p + strlen(p) - 1; //尾元素地址//從左往右while(*start == ' ' && *start != '\0'){start++;}while(*end == ' ' && end != p){end--;}int n = end-start+1;  //5-1=4,但是實際上元素由5個所以+1printf("n = %d\n", n);char buf[100]="aaaaaaaaaaa";strncpy(buf,start,n);buf[n] = 0; //結束符printf("buf = %s\n",buf);return 0;
}

課堂筆記

void fun(int b[10][10]); //ok
void fun(int **p); //err,二維數組不是二級指針int *fun(); //返回值是指針類型,指針函數0          數字0,和'\0'等價
'\0'
'0''0'字符'0',不是結束符,ascii為48char a[] = {'a', 'b'}; 
printf("%s\n",a); //亂碼,沒有結束符char a[10] = {'a', 'b'}; //后面自動補0
printf("%s\n",a); //正常char a[] = {'a', 'b', 0};
char a[] = {'a', 'b','\0'};
printf("%s\n",a);//正常char a[] = {'a','b','0'};
printf("%s\n",a); //亂碼,沒有結束符char buf[] = "hello"; //以字符串初始化,自動隱藏結束符'\0'

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

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

相關文章

Nginx — Nginx安裝證書模塊(配置HTTPS和TCPS)

一、安裝和編譯證書模塊 [rootmaster nginx]# wget https://nginx.org/download/nginx-1.25.3.tar.gz [rootmaster nginx]# tar -zxvf nginx-1.25.3.tar.gz [rootmaster nginx]# cd nginx-1.25.3 [rootmaster nginx]# ./configure --prefix/usr/local/nginx --with-http_stub_…

計算機網絡 用deepseek幫助整理的復習資料(一)

### 計算機網絡基礎知識整理 --- #### **一、網絡類型** 1. **局域網 (LAN)** - **定義**&#xff1a;覆蓋小范圍&#xff08;如家庭、教室、公司&#xff09;。 - **特點**&#xff1a;高帶寬、低延遲&#xff0c;設備通過交換機互聯。 - **示例**&#xff1…

Linux SCP傳輸文件免密配置

文章目錄 Linux SCP傳輸文件免密配置生成SSH密鑰對將公鑰復制到遠程服務器測試SSH連接使用SCP免密傳輸文件可選配置帶密碼的秘鑰連接處理使用 ssh-agent進行緩存管理&#xff08;該方式只能確保同一個回話中&#xff0c;多次傳輸只輸一次密碼&#xff09;使用 keychain&#xf…

數字電子技術基礎(三十六)——利用Multisim軟件實現3線-8線譯碼器

目錄 1 手動方式實現3線-8線譯碼器 2 使用字選擇器實現3線-8線譯碼器 現在嘗試利用Multisim軟件來實現3線-8線譯碼器。本實驗目的是驗證74LS138的基本功能&#xff0c;簡單來說就是“N中選1”。 實驗設計&#xff1a; &#xff08;1&#xff09;使能信號&#xff1a;時&am…

wait和notify : 避免線程餓死(以及votile內存可見性和指令重排序問題)

各位看官&#xff0c;大家早安午安晚安呀~~~ 如果您覺得這篇文章對您有幫助的話 歡迎您一鍵三連&#xff0c;小編盡全力做到更好 歡迎您分享給更多人哦 今天我們來學習&#xff1a;wait和notify : 避免線程餓死&#xff08;以及votile內存可見性和指令重排序問題&#xff09; …

HarmonyOS 介紹

HarmonyOS簡介 隨著萬物互聯時代的開啟&#xff0c;應用的設備底座將從幾十億手機擴展到數百億IoT設備。全新的全場景設備體驗&#xff0c;正深入改變消費者的使用習慣。 同時應用開發者也面臨設備底座從手機單設備到全場景多設備的轉變&#xff0c;全場景多設備的全新底座&am…

【視覺提示學習】3.28閱讀隨想

2109.01134 CoOp通過可學習的向量來建模提示的上下文詞匯&#xff0c;這些向量可以用隨機值或預訓練的詞嵌入進行初始化&#xff08;見圖2&#xff09;。我們提供了兩種實現方式&#xff0c;以處理不同性質的任務&#xff1a;一種是基于統一上下文&#xff08;unified context…

計算機求職面試中高頻出現的經典題目分類整理

以下為計算機求職面試中高頻出現的經典題目分類整理&#xff0c;涵蓋技術核心與深度考察方向&#xff0c;答案要點已附解析思路&#xff1a; 一、數據結構與算法 鏈表操作 題目&#xff1a;反轉鏈表&#xff08;迭代/遞歸實現&#xff09;考察點&#xff1a;指針操作、遞歸思維…

uniapp選擇文件使用formData格式提交數據

1. Vue實現 在vue項目中,我們有個文件,和一些其他字段數據需要提交的時候,我們都是使用axios 設置請求頭中的Content-Type: multipart/form-data,然后new FormData的方式來進行提交。方式如下: const sendRequest = () => {const formData = new FormData()formData…

BeanDefinition和Beanfactory實現一個簡單的bean容器

目錄 什么是 Springbean 容器 設計思路 圖解 參考文章 開源地址 BeanDefinition 類 BeanFactory 類 測試類 什么是 Springbean 容器 Spring 包含并管理應用對象的配置和生命周期&#xff0c;在這個意義上它是一種用于承載對象的容器&#xff0c;你可以配置你的每個 Bea…

AI Agent開發大全第十四課-零售智能導購智能體的RAG開發理論部分

開篇 經過前面的一些課程,我們手上已經積累了各種LLM的API調用、向量庫的建立和使用、embedding算法的意義和基本使用。 這已經為我們具備了開發一個基本的問答類RAG的開發必需要素了。下面我們會來講一個基本問答類場景的RAG,零售中的“智能導購”場景。 智能導購 大家先…

向字符串添加空格

給你一個下標從 0 開始的字符串 s &#xff0c;以及一個下標從 0 開始的整數數組 spaces 。 數組 spaces 描述原字符串中需要添加空格的下標。每個空格都應該插入到給定索引處的字符值 之前 。 例如&#xff0c;s "EnjoyYourCoffee" 且 spaces [5, 9] &#xff0…

百人會上的蔚小理與「來的剛剛好」的雷軍

這就是2025百人會上的蔚小理&#xff0c;努力的李斌、宣揚飛行汽車的何小鵬與大講開源的李想。那么小米汽車的模式是什么呢&#xff1f;站在蔚小理的肩上。 這就是2025百人會上的蔚小理&#xff0c;努力的李斌、宣揚飛行汽車的何小鵬與大講開源的李想。那么小米汽車的模式是什么…

解鎖Nginx路由器匹配規則

引言 Nginx 無疑是一款備受矚目的明星產品。它以其高性能、高可靠性以及出色的并發處理能力&#xff0c;在眾多 Web 服務器和反向代理服務器中脫穎而出 &#xff0c;廣泛應用于各類網站和應用程序中。據統計&#xff0c;超過 30% 的網站都在使用 Nginx 作為其 Web 服務器&…

傳統策略梯度方法的弊端與PPO的改進:穩定性與樣本效率的提升

為什么傳統策略梯度方法&#xff08;如REINFORCE算法&#xff09;在訓練過程中存在不穩定性和樣本效率低下的問題 1. 傳統策略梯度方法的基本公式 傳統策略梯度方法的目標是最大化累積獎勵的期望值。具體來說&#xff0c;優化目標可以表示為&#xff1a; max ? θ J ( θ )…

Qwt入門

Qwt(Qt Widgets for Technical Applications)是一個用于科學、工程和技術應用的 Qt 控件庫,提供曲線圖、儀表盤、刻度尺等專業可視化組件。 1. 安裝與配置 1.1 安裝方式 源碼編譯(推薦): git clone https://github.com/qwt/qwt.git cd qwt qmake qwt.pro # 生成 Makef…

軟考《信息系統運行管理員》- 6.1 信息系統安全概述

信息系統安全的概念 信息系統安全是指保障計算機及其相關設備、設施(含網絡)的安全&#xff0c;運行環境的安全&#xff0c; 信息的安全&#xff0c;實現信息系統的正常運行。 信息系統安全包括實體安全、運行安全、信息安全和 人員安全等幾個部分。 影響信息系統安全的因素…

Canvas實現旋轉太極八卦圖

Canvas實現旋轉太極八卦圖 項目簡介 這是一個使用HTML5 Canvas技術實現的動態太極八卦圖&#xff0c;包含了旋轉動畫和鼠標交互功能。項目展示了中國傳統文化元素與現代Web技術的結合。 主要特點 動態旋轉的太極圖八卦符號的完整展示鼠標懸停暫停動畫流暢的動畫效果 技術實…

機器學習、深度學習和神經網絡

機器學習、深度學習和神經網絡 術語及相關概念 在深入了解人工智能&#xff08;AI&#xff09;的工作原理以及它的各種應用之前&#xff0c;讓我們先區分一下與AI密切相關的一些術語和概念&#xff1a;人工智能、機器學習、深度學習和神經網絡。這些術語有時會被交替使用&#…

打造高性能中文RAG系統:多輪對話與語義檢索的完美結合

目錄 1、引言 2、RAG系統的核心架構 3、對話理解&#xff1a;超越單輪問答 3.1、指代消解技術 3.2、話題跟蹤與記憶 4、混合檢索策略&#xff1a;兼顧精確與廣泛 4.1、向量檢索 關鍵詞檢索 4.2、重排序機制 5、性能優化&#xff1a;應對大規模文檔 5.1、向量量化技術…