1. 程式人生 > >C——提高(2)字串一級指標、二級指標記憶體模型

C——提高(2)字串一級指標、二級指標記憶體模型

字串一級指標

C語言裡沒有實質的字串型別,通過字元陣列來模擬。
C語言的字串是以0結尾的字串。
C語言字串的記憶體分配 可以分配在堆上、棧上、全域性區上。

1、字串一級指標記憶體模型

buf陣列與指標的區別:

這裡寫圖片描述

注意:
char buf[20] = “aaaa”; 字串陣列的初始化步驟是,先在常量區建立字元常量“aaaa”,再從字元常量區拷貝字元到堆區(臨時區)。

2、字串copy函式的經典實現及判空和引入輔助指標變數

//int copy(char *from, char *to) {
//  if (from == NULL || to == NULL) {
//      return -1;
// } // while( (*to = *from) != '\0' ){ // from ++; // to ++; // } //} int copy(char *from, char *to) { // 為了程式的健壯性,這裡要判空 if (from == NULL || to == NULL) { return -1; } // 不要輕易改變形參的值,最好引入一個輔助的指標變數,把形參給接過來... char *tem_from = from; char * temp_to = to; while( *temp_to ++ = *tem_from ++ ); // 空語句
printf("%s", from);// 因為形參from指標沒有發生變化,這裡可以正常列印。 } int main() { char *from = "abce"; char *to[100]; copy(from, to); printf("to=%s \n", to); system("pause"); return 0; }

二級指標

1、二級指標記憶體模型

這裡寫圖片描述

二級指標的三種記憶體模型,對應C語言字串的記憶體分配 可以分配在堆上、棧上、全域性區上。
第一種記憶體模型:指標陣列,對應字串分配在全域性區(程式碼區)。
第二種記憶體模型:二維陣列,對應字串分配在棧上。
第三種記憶體模型:手工打造二級指標,對應字串分配在堆上。

2、二級指標做函式引數

第一種記憶體模型:陣列做函式引數退化為指標,指標陣列做函式引數退化為二級指標。
第二種記憶體模型:二維陣列做函式引數退化為一個指向一維陣列的指標。
第三種記憶體模型:被調函式分配記憶體,將結果甩出來給主調函式。

相關推薦

C——提高2字串一級指標二級指標記憶體模型

字串一級指標 C語言裡沒有實質的字串型別,通過字元陣列來模擬。 C語言的字串是以0結尾的字串。 C語言字串的記憶體分配 可以分配在堆上、棧上、全域性區上。 1、字串一級指標記憶體模型 buf陣列與指標的區別: 注意: char buf[20

c理解提高5字串copy函式技術推演

#include <stdlib.h> #include <string.h> #include <stdio.h> void main01() { //通過棧的方式對資料進行拷貝 char a[] = "i am a student"; char b[6

c理解提高2變數的本質

變數本質分析 變數概念 概念:既能讀又能寫的記憶體物件,稱為變數;若一旦初始化後不能修改的物件則稱為常量。  變數定義形式:     型別  識別符號, 識別符號, … , 識別符號 ; 例如: &nb

C#基礎2

i++ body 相同 代碼筆記 發布 product 產品 直接 只需要 摘要:面向對象編程是很多編程語言的一種重要思想。萬物皆對象。有很多種不同個人理解,其實,用的多了,也就能夠去體會和領悟這種思想。個人理解:一個類或者接口, 就是對象,面向對象就是對類或者接口的操作,

Effective C++ 筆記2構造/析構/賦值運算

賦值構造 只讀 初始 pre cti copy 類構造 div vat 05、了解C++默默編寫並調用哪些函數   (1)、默認構造函數 Empty(){...} //調用父類構造函數,non-static成員變量構造函數,不會默認初始化內置類型   (2)、析構函數

c練習題1字串操作練習題

1、有一個字串開頭或結尾含有n個空格(”   abcdefgdddd    ”),欲去掉前後空格,返回一個新字串。 要求1:請自己定義一個介面(函式),並實現功能;70分 要求2:編寫測試用例。30分 int trimSpace(char

P1951 收費站_NOI導刊2009提高2

二分答案+dijkstra 這道題有被改編的另一道題:“通往奧格瑞瑪的道路”,相信你也做過吧。。。 看到“交的費用中最多的一次最少是多少”,就應該想到二分答案了。 所以我們二分費用,判斷最多的費用是一個\(mid\)的時候可不可以成功到達終點。 如何判斷能否成功到達終點? 不要說用SPFA!因為……

C++過載2:通過成員函式和友元函式過載

分別通過成員函式和友元函式完成過載 #include <iostream> using namespace std; class Complex { public: Complex(double real =0,double imag=0):real(real),imag(i

洛谷 P1951 收費站_NOI導刊2009提高2

題目描述 在某個遙遠的國家裡,有n個城市。編號為1,2,3,…,n。 這個國家的政府修建了m條雙向的公路。每條公路連線著兩個城市。沿著某條公路,開車從一個城市到另一個城市,需要花費一定的汽油。 開車每經過一個城市,都會被收取一定的費用(包括起點和終點城市)。所有的收費站都在城市中,在

初級C語言2

1.變數——在執行過程中可以改變的 一般在棧stack 中存放 左值=右值 作用域:花括號內 ——————區域性變數 生命週期:當前函式結束後 變數的記憶體 會自動回收 定義變數不能數字開頭 不能使用未初始化的變數 1.1棧(stack)又名堆疊, 大小:1m-2m 通常由計算機自動分配,它

C++學習筆記2——程式的建立編譯與除錯

單位新來的同事(也是非科班出生)問我程式設計用什麼軟體時,我大多會告訴他們VS2010或者VS2008(原諒我們單位用的IDE還如此老舊)。他們便會找來VS2010或者VS2008的教程,一步步照著做起來。新建工程,寫了一個main函式,列印了“helloworld”,點選了

JavaScript2字串和函式

字串 <body> <script type="text/javascript"> //字串的使用 var s1=new String("h"); var s2="h"; //

C++排序2——選擇排序

#include <iostream> #include <vector> using namespace std; //選擇排序 //演算法時間複雜度 O(n*n) //額外空間複雜度 O(1) void Selection_Sort

洛谷 P1951 收費站_NOI導刊2009提高2 最短路+二分

目錄 題面 題目連結 題目描述 輸入輸出樣例 輸入樣例: 輸出樣例: 說明 思路 AC程式碼 總結 題面 題目連結 其實還有一道雙倍經驗 題目描述 在某個遙遠的國家裡,有n個城市。編號為1,2,3,…,n。 這個國家的政府修建了m條雙向的公路。每條公路連線著兩個城市。沿著某條公路,開車從一個

Why Java Sucks and C# Rocks2:基礎型別與物件

既然已經談過這次語言比較的意義與目的,而完整的幻燈片和錄音也已經放出,那麼接下來自然是詳細討論了。在這篇文章中,我會對兩個語言的基本特徵進行簡單描述,並主要討論兩者對於基礎型別的處理方式。在我看來,Java語言對於基礎型別的處理方式,並不如C#中值型別般妥當。如果您有任何覺得不妥或是想要補充的意見,請不吝回覆

設計模式C++實現2——策略模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一

C++學習2:對C++的巨集觀認識

前言: 對於新知識先來一個巨集觀認識,然後深入到細節,有了相當量的微觀認識後,再抽象到巨集觀認識,這樣學習的效果非常好,以上屬於方法論的範疇,俗稱深入淺出。舉個例子,最初聽到偉人說的那句“好好學習,天天向上”並沒有覺得很響亮,但是隨著大量的學習和實踐,突然發現偉

js2 javascript中物件陣列字串合併的方法

一、js中物件合併的方法1)第一種方法var a = { a : '1', b : '2' } var content = { c: '3', ...a } console.log(content) //content = {c: "3", a: "1", b: "

Python學習2——字串與數字轉化

字串轉化為數字 import string ts = ‘123’ num = string.atoi(ts) int(x [,base ])        將x轉換為一個整數    long(x [,base ])        將x轉換為一個長整數    float

Java常見幫助類2字串處理類

閒話少說,下面幫組類主要是實現字串判空,字串相等,字串替換,字串填補等十幾個功能,具體看程式碼: /** * 字串處理類 * * */ public class StringUtil { /** * 判斷字串是否為空 * * @param str * @r