1. 程式人生 > >int a[]與int* a的區別

int a[]與int* a的區別

當你凝視深淵的時候,深淵也在凝視你。

作者: [email protected]

NOTE: 此文件只是個人理解,其中如有錯誤望可以指正。

結論是這樣式兒的:

  • 指標佔用記憶體空間儲存地址;陣列名是一個數組起始的位置。指標的指向可以修改,陣列在記憶體中起始位置無法修改。
  • 對指標使用sizeof得到的是4位元組(32-bit)和8位元組(64-bit),而對陣列名使用sizeof得到的是陣列的大小。
  • 做為形參的時,int a[]與int *a沒有實際作用上的區別。當然,如果你採用a[]作為形參,可以更明顯的體現這是一個數組。
  • 第四點還沒想起來,想起來再說吧。。。

背景可能是這樣式兒的:

本胖遇到了一個常見的問題,即需要根據不同的情況構建佔用不同大小的儲存區域,並格式化。

即存在如下的兩個結構體,而其中N的值為不定值;

typedef struct _test_a_tag 
{
    int32_t a;
    int16_t b;
    uint8_t c;
} tat;

typedef struct _test_b_tag
{
    int16_t num;
    tat tat[N];
} tbt;

本胖想到的第一個方案是:

typedef struct _test_b_tag
{
    int16_t num;
    tat* tat;
} tbt;

tbt->tat = malloc(sizeof(N * tat));

這樣的結果是如果tbt同樣使用malloc獲取記憶體,就需要使用兩次malloc構建tbt。而在本胖的程式碼中這樣做會導致大量冗餘的操作。
於是,本胖換了一種結構體:

typedef struct _test_b_tag
{
    int16_t num;
    tat tat[];
}tbt;

tbt* tbt = (tbt*)malloc(sizeof(tbt) + N * sizeof(tat));

這樣可以省去兩次malloc的操作。

/*你可以修改一個指標的指向,但你不能修改陣列名的指向*/
tat* tat; //這裡實際上是申請了一個指標變數,其指向的目標在未賦值前是未知的。可以使用tat++;
tat tat[]; //這裡的tat實際上是定義了在這個位置是一個靜態的指標陣列。不可以使用tat++;

如果你在vs 2017的編譯環境下鍵入類似上述的結構,你會發現:

tat* tat; tat在vs除錯資訊中的型別是 test_a_tag*
tat tat[];tat在vs除錯資訊中的型別是 test_a_tag[0]

需要注意的是:

在vs2017中:

typedef struct test_a_tag
{
    int32_t a;
    int32_t b[];
} tat;

sizeof(tat) = 4;  //32-bit

相關推薦

int a[]int* a區別

當你凝視深淵的時候,深淵也在凝視你。 作者: [email protected] NOTE: 此文件只是個人理解,其中如有錯誤望可以指正。 結論是這樣式兒的: 指標佔用記憶體空間儲存地址;陣列名是一個數組起始的位置。指標的指向可以

char *achar a[n]的區別

機制 strcat 停止 添加 字符 區別 是把 har 自動 char *a=‘ab‘;//a[2]一定為‘\0‘,但是,a[5]這樣的指針越界不會報錯 char a[3] = {‘a‘,‘a‘,‘a‘};//a[3]屬於越界,會報錯 char b[5]={‘b‘,‘b‘

mysql中int(3)int(11)有什麽區別嗎?

png 不足 次方 表示 分享 什麽 否則 數據庫 SQ 註意:這裏的M代表的並不是存儲在數據庫中的具體的長度,以前總是會誤以為int(3)只能存儲3個長度的數字,int(11)就會存儲11個長度的數字,這是大錯特錯的。 其實當我們在選擇使用int的類型的時候,不論是i

char *a char a[] 的區別

第一個 4行 常量 指向 字符串 區別 png com ons char* a = "hello"; 和 char a[] = "hello"; 的區別: 1、 char* a = "hello"; 中的a是指向第一個字符h的的指針變量。 第2行說明a所指向的字符串是在

Linux .a.so的區別

在linux平臺上編譯時,常會遇到目標庫的疑問,有靜態庫也有動態庫,單個理解都不太難,但是對複雜的工程而言,一旦混合到一起去,對整個工程的理解和呼叫,將會造成很大困擾,本文就彙總這幾種常見編譯結果檔案的區別。 一、格式說明 linux下編譯,常會遇到字尾為:.o .s

14443-A 14443-B區別

常用的RFID卡分佈在高頻和超高頻。 高頻卡目前的頻率主要是13.56MHz。有幾種標準;ISO-14443-A、ISO-14443-B、ISO-15693、ISO-18000-3; 超高頻的有ISO-18000-6和EPC標準。 ISO-14443-A和ISO-14443-B的主要區別在於編碼方式。ISO

mysql int(m)int(m)的差別

data bool adding lec 數據庫 lean 沒有 art same 預計大多數開始接觸mysql的朋友們都會有這個問題:int(M) 裏面的數值究竟是什麽意思? 依據相關資料總結了下: int(M) zerofill,加上zerofill後M

功能概述:簡單介紹substring(a)substring(a,b)的用法

package com.substring.demo;   public class test {       /**      * 關於substring(a)與substring(a,b)的運用  &nb

人生苦短,我學Python——【1】import Afrom A import a

span 屬性。 屬性 人生 之間 style 需要 code pri import datetime是引入整個datetime包,如果使用datetime包中的datetime類,需要加上模塊名的限定。 1 import datetime 2 3 print(date

imshow(A,[])imshow(A)不同

比如一幅影象A包含灰度值1,2,4,當使用imshow(A),結果就會顯示1,2,4的灰度值,從人的肉眼看去是看不出變化的。而當使用imshow[A, []]後則matlab會自動拉伸灰度值,將1,2,4變化到0,85,255.這樣影象看起來對比度明顯,肉眼也能分辨。 具體

關於Char *aChar a[]中變數佔用空間的大小(Windows 7 32位)

去面試時幾家公司很愛在char *和char []上做文章,很基礎也容易犯錯。面試題裡很喜歡折騰這些內容,在這裡簡單的做個比較。 如果有錯誤,請指正。 1、Test 1 //字元陣列大小未指定大小,指標變數運算元沒有型別 #include <iostream>

在全局的int a;和int a=1;有什麽區別

rmp fan super otg e30 int cdr DdGzS ddc 頤兆鮮ddu00飾按顏http://www.docin.com/app/user/userinfo?userid=179116305晃和掖o9gpj夢那慈http://tushu.docin.c

int a和(int &)a區別(轉)

not strong c++引用 alt ios ostream light write highlight (1)語言的類型的強制轉換不會修改原來的數據,會另外的開辟一個臨時的或者程序中指定的空間來存儲強制轉換後的值。 (2)C++引用的實現是在符號表中動了手腳,把自己的

const int a; int const a; const int * a; int * const a; int const * const; 之間的區別

const int a; int const a; const int * a; int * const a; int const * const; 之間的區別   const int a; int const a;&nb

C語言筆試題之——BOOL,int,float,指標型別的變數a “零”的比較

Bool型: if(a) if(!a) BOOL型,沒什麼好講的,無非就是true或false判斷 int型: if(0 == a) if(0 != a) float型: const float EPSILON=0.000001; if(abs(a)<=E

分別寫出BOOL,int,float,指標型別的變數a“零”的比較語句

BOOL :  if ( !a ) or if(a) int :   if ( a == 0) float : const EXPRESSION EXP = 0.000001   <span style="white-space:pre"> </span&

筆試訓練-分別寫出BOOL,int,float,指標型別的變數a “零”的比較語句

分別寫出BOOL,int,float,指標型別的變數a 與“零”的比較語句。 答案: BOOL :    if ( !a ) or if(a) int :     if ( a == 0) float :   const EXPRESSION EXP = 0.00

JAVA學習筆記(1)——a++++a區別

col int 演示 opera 解析 代碼 數據 ++i div 需求:此博客用於解釋i++與++i的區別。 過程: 1、名稱解釋 ++:自增,即在原有數據基礎上+1,再賦給原有數據。 2、程序演示 (1)代碼: 1 class OperateDemo 2 { 3

intInteger區別(基本類型復雜類型的對比)轉

數據 value 1.5 rand 雜類 多個 關鍵字 乘除 行數 基本類型,或者叫做內置類型,是JAVA中不同於類的特殊類型。 Java中的簡單類型從概念上分為四種:實數、整數、字符、布爾值。但是有一點需要說明的是,Java裏面只有八種原始類型,其列表如下: 實數:dou

int a=1,b=~a;請問b的值是多少?

十進制 取反 請問 計算機 進制 反碼 二進制補碼 nbsp 計算 int a=1,b=~a; 首先計算機中存儲的是二進制補碼。 把1轉為二進制:0000 0001 ->反碼 0000 0001 ->補碼 0000 0001 ->取反 111