陣列與指標的區別及函式的呼叫
1.陣列與指標的區別:
(1)空間分配
指標是動態分配空間,通過malloc在堆上分配所需要的空間,分配的空間不一定連續,在使用完之後需要呼叫free()來釋放分配空間。而陣列是靜態分配空間,在全域性變數區或者棧
上分配空間,分配的空間是連續的,區域性變數在生命週期結束後自動釋放,全域性變數在程式結束完自動釋放。
(2)訪問效率
指標是通過地址間接訪問,而陣列是直接訪問數值。因此指標的訪問效率低,陣列的訪問效率高。
(3)安全性
指標使用不當會造成記憶體洩漏,陣列使用不當會造成陣列越界。
(4)函式引數
陣列要用相應的指標當形參,而指標要用指標的指標來當形參。
(5)位元組大小
指標的位元組大小是固定的,由作業系統決定。陣列的位元組大小由陣列大小和陣列指向的型別共同來決定。
(6)識別符號
指標名是變數,陣列名是指標常量。所以指標p可以進行p++,而陣列名不可以用於a++。
(7)對應的記憶體空間
指標儲存的是地址,陣列儲存的是數值。
2.函式的使用:
對於一個函式我們需要注意他的函式名,形參和返回值。
(1)函式名也是一個指標常量,儲存的是函式存放的地址(函式的入口地址)。
(2)函式的呼叫:
1.通過函式名找到函式的入口地址。
2.給形參分配記憶體空間。
3.傳值:把實參變數對應空間的值傳給形參變數對應的空間。
4.執行函式體裡的語句。
5.函式返回並釋放記憶體空間。
這裡我們需要注意的是什麼時候給函式形參傳遞值,什麼時候給函式形參傳遞地址。
讀(只使用,不修改)實參變數對應的記憶體空間的值時,傳實參變數名。
寫(即使用,也修改)實參變數對應記憶體空間的值時,傳實參變數對應的記憶體空間的地址。
呼叫函式要對返回值作出判斷。
要進行入口引數檢查,最好不要依賴於別人已經實現的函式。
例如:當我們給一個指標分配空間時就要對其返回值進行判斷。
int *ptr;
ptr = (int *)malloc(sizeof(char)*100);
if(ptr == NULL)
{
printf("error!");
exit(1);
}
exit(1)結束整個程式,標頭檔案為#include<stdlib.h>
echo $?當前結束程式的返回值。
傳入引數:本身有值,帶入函式呼叫。
傳出引數:沒用值,在函式執行呼叫過程中把值帶出,可以充當函式的返回值。
返回區域性變數的地址很危險,容易釋放,所以return 不能返回區域性變數的地址。
相關推薦
陣列與指標的區別及函式的呼叫
1.陣列與指標的區別: (1)空間分配 指標是動態分配空間,通過malloc在堆上分配所需要的空間,分配的空間不一定連續,在使用完之後需要呼叫free()來釋放分配空間。而陣列是靜態分配空間,在全域性
函式返回指標,引用與指標區別
1,函式不可以返回棧記憶體的指標,但是可以返回堆記憶體的指標,可以free掉兩次指向空的指標,但是不能連續free兩次指向記憶體的指標,會產生已放棄 int main() { int *a; a = (int *)malloc(10); a[0] = 1
C語言中陣列與指標的區別
本文是對《C語言深度剖析》一書內容的拓展,在看這本書的時候解了很多我之前的一些困惑,故在此記錄。對陣列的引用總是可以寫成對指標的引用,而且確實存在一種指標和陣列的定義完全相同的上下文環境。 但是指標和陣列還是在本質上是不一樣的。指標就是指標,指標變數在32位的系統下面是4B
[基礎知識]6.陣列與指標的區別
下面程式碼的執行結果是? int GetSize(int data[]){ return sizeof(data); } int _tmain(int argc, _TCHAR* argv[]) { int data1[] = {1,2,3,4,5}; int size1 =
一維陣列與指標,二維陣列與指標,指標陣列及陣列指標的概念詳解、例項解析
概念詳解:指標:指標與“int a”,“float b”一樣,也是一種變數,只是指標變數中儲存的是記憶體單元的地址,這是與“int a”和“float b”的本質區別,C語言的精華就在於指標、結構體和連結串列。一維陣列:定義一維陣列之後,即在記憶體中分配一段連續的地址空間,如
《C語言及程式設計》實踐專案——二維陣列與指標
【專案1-二維陣列當函式引數】定義一個函式來完成對引數陣列中元素的求和工作,函式宣告如下:int sum(int array[ ][4],int m,int n); //該函式完成對array陣列中的前m行和n列元素求和在以下程式的基礎上,完成對sum函式的定義。#include <stdio.h&g
sql(join中on與where區別) / NVL函式 / oracle儲存過程中is和as區別 / JAVA呼叫資料庫儲存過程
left join :左連線,返回左表中所有的記錄以及右表中連線欄位相等的記錄。 right join :右連線,返回右表中所有的記錄以及左表中連線欄位相等的記錄。 inner join: 內連線,又叫等值連線,只返回兩個表中連線欄位相等的行。 full join:外連線,返回兩個表中的行:left jo
函式宣告的幾種方式,函式宣告與函式表示式的區別,函式呼叫的幾種方式
函式宣告的幾種方式 三種 : 函式宣告(1),函式表示式(2~5),Function構造器(6) 1.function func1(a){}//函式宣告 2.var func2=function(b){}//函式表示式 3.var func3=function func4(
函式內 宣告一個字元陣列和一個指向字串陣列的指標 區別
函式內 宣告一個字元陣列: char* Fuction()...{ char a[]="abcdefg";//存取在棧中return a; //返回指向“棧記憶體”的指正,VC6.0發出warning} 函式內宣告一個指向字串陣列
MySQL中MyISAM與InnoDB區別及選擇,mysql添加外鍵
title 必須 pan 就會 默認 簡化 平臺 兩種 myisam InnoDB:支持事務處理等不加鎖讀取支持外鍵支持行鎖不支持FULLTEXT類型的索引不保存表的具體行數,掃描表來計算有多少行DELETE 表時,是一行一行的刪除InnoDB 把數據和索引存放在表空間裏面
js onclick與addEventListener 區別及用法
nbsp scala 一段 onclick 元素 user 不同的 公司 utf-8 addEventListener(建議使用)好比一個監聽容器,這個容器裏面可以裝很多個監聽事件,而且每一個事件都會執行。 onclick 在今天之前我使用這個(onclick)比較多(單純
MySQL中MyISAM與InnoDB區別及選擇
重建 包含 好的 數據 mysql 備份 處理 表空間 種類 InnoDB:支持事務處理等不加鎖讀取支持外鍵支持行鎖不支持FULLTEXT類型的索引不保存表的具體行數,掃描表來計算有多少行DELETE 表時,是一行一行的刪除InnoDB 把數據和索引存放在表空間裏面跨平臺可
WPF TemplateBinding與Binding區別及自定義ImageButton
TemplateBinding與Binding區別在於 1:TemplateBinding只是單方向的資料繫結 2:TemplateBinding不會自動轉換資料型別 這裡用一個自定義ImageButton驗證下第2條: public class ImageButton : Button
【C語言】一維陣列、二維陣列與指標
一維陣列和指標: 1、一維陣列名: 對於這樣的一維陣列:int a[4]; a作為陣列名就是我們陣列的首地址, a是一個地址常量 . 首先說說常量和變數的關係, 對於變數來說, 用箱子去比喻再好不過了, 宣告一個變數就宣告一個箱子,比如我們開闢出一個蘋果型別的箱子, 給這個變
fortran陣列與指標淺談一
Program vp implicit none integer, target :: x(5) = [1,2,3,4,5] integer, pointer :: p(:) => null() p => x !.. 指標指向陣列x
Ruby--陣列與字串轉換及去重
1 字串轉陣列 split(",") #字串a a = "12,34,56" #陣列a a = a.split(",") #a = ["12","34","56"] 2 陣列轉成字串 join(",") #陣列 a = ["12","34
Mabitis中的#與$符號區別及用法介紹
一、介紹 mybatis 中使用 Mapper.xml裡面的配置進行 sql 查詢,經常需要動態傳遞引數,例如我們需要根據使用者的姓名來篩選使用者時,sql 如下: ?
引用與指標區別
區別: 引用不能為空,當引用被建立時,它必須被初始化;指標可以為空值,可以在任何時候被初始化 一旦一個引用被初始化為指向一個物件,它就不能改變為另一個物件的引用。指標則可以在任何時候指向另一個物件 不可能有NULL引用,必須確保引用是和一塊的合法的儲存單元關聯
【c語言】帶你真正走進指標的世界——陣列與指標的關係(一)
每天下課之後,都感覺老師上課在神仙程式設計,我們一群凡人在底下面無表情地走神,前一秒還是在講加減乘除的基本用法,後一秒就變成了指標陣列、陣列指標、結構體指標和N級指標的性質以及運用............(真是令人頭禿 —^—) ——————
嵌入式c語言基礎 --陣列與指標
嵌入式c語言基礎 1.指標與陣列 指標是一種變數的型別,存放某一元素的地址 指標獲取陣列中的值 #include <stdio.h> int main(void) { int a = 10; int *p = &a;