① 指針與指針變數的概念是什麼
1、指針,是C語言中的一個重要概念及其特點,也是掌握C語言比較困難的部分。指針也就是內存地址,指針變數是用來存放內存地址的變數,不同類型的指針變數所佔用的存儲單元長度是相同的,而存放數據的變數因數據的類型不同,所佔用的存儲空間長度也不同。
有了指針以後,不僅可以對數據本身,也可以對存儲數據的變數地址進行操作。
2、指針變數是指存放地址的變數。因地址的改變而做出指定性質的衡量變法。
(1)指針變數可存放存儲單元地址擴展閱讀:
指針變數定義:
1、定義指針變數的一般形式如下:
類型名*指針變數名1,*指針變數名2,... *指針變數名n ;
2、空指針
空指針是一個特殊的指針,它的值是0,C語言中用符號常量NULL(在stdio.h中定義)表示這個空值,並保證這個值不會是任何變數的地址。空指針對任何指針類型賦值都是合法的。一個指針變數具有空指針值表示當前它沒有指向任何有意義的東西。
3、void指針
(void *)類型的指針叫通用指針,可以指向任何的變數,C語言允許直接把任何變數的地址作為指針賦給通用指針。
但是需要注意void*不能指向由const修飾的變數,例如const int test; void * ptv; ptv = &test;第三句是非法的,只有將ptv聲明為const void * ptv;,上述第三句ptv = &test才是合法的。
當需要使用通用指針所指的數據參加運算時,需要寫出類型強制轉換。如通用指針ptv 所指空間的數據是整型數據,p是整型指針,用此式轉換:p=(int *)ptv;
② C語言當定義一個指針是如何存儲的
在 C 語言中,將內存單元的編號或地址稱為指針。可通過一個變數來存放指針,這種變數稱為指針變數。因此,一個指針變數的值就是某個內存單元的地址,或稱為某內存單元的指針。它與其他一般變數所不同的是,一般的變數包含的是實際的、真實的數據;而指針只是一個指示器,它告訴程序在內存的哪塊區域可以找到數據。
③ 指針「變數裡面的值」 和 「指針地址的值」 和 「指針指向的值」 有什麼區別
指針「變數裡面的值」存放的是內存單元的地址;「指針地址的值」指的是指針的地址值,用「&」表示;「指針指向的值」指的是指針所指向的變數的值,用「*」表示。
指針是編程語言中的一個對象,直接地對地址進行操作,其的值直接指向存在電腦存儲器中另一個地方的值。通過地址能找到所需的變數單元,也就是,地址指向該變數單元。由此,地址形象化的被稱為「指針」。其意是通過它能找到以它為地址的內存單元。
指針一般出現在比較接近機器語言的語言,如匯編語言或C語言。
(3)指針變數可存放存儲單元地址擴展閱讀
指針與引用的區別:
一、指針和引用的區別
(1)引用總是指向一個對象,沒有所謂的 null reference .所有當有可能指向一個對象也有可能不指向對象則必須使用 指針.
由於C++ 要求 reference 總是指向一個對象所以 reference要求有初值.
String & rs = string1;
由於沒有所謂的 null reference 所以在使用前不需要進行測試其是否有值,而使用指針則需要測試其的有效性.
(2)指針可以被重新賦值而reference則總是指向最初或地的對象.
(3)必須使用reference的場合. Operator[] 操作符 由於該操作符很特別地必須返回 [能夠被當做assignment 賦值對象] 的東西,所以需要給他返回一個 reference.
(4)其實引用在函數的參數中使用很經常.
void Get***(const int& a) //這樣使用了引用又可以保證不修改被引用的值
{
}
④ 指針變數問題
首先要區別int *p[2]和int (*p)[2],前者定義一個數組,該數組元素類型為整型指針;後者定義一個指針變數,該指針變數指向一個整型二維數組。
1.指針變數代表一個存儲單元地址,佔用存儲單元一般為4個位元組-即一個存儲單元,(32位計算機)。與其基類型數組無關,因為它僅代表一個地址。
2.指針變數佔用的存儲單元與編譯器有關。16位計算機為2個位元組,32位計算機為4個位元組。與基類型無關。
⑤ C語言中指針變數只能存儲地址
存放地址的變數稱為指針變數。指針變數是一種特殊的變數,它不同於一般的變數,一般變數存放的是數據本身,而指針變數存放的是數據的地址。
假設在程序中聲明了1個int型的變數a,其值為68。系統為變數a分配的首地址為0X65FDF4H,pa是存放變數a地址的指針變數,即pa中存放的值為0x065FDF4H。
對變數a的訪問有兩種方式:一是直接按地址0x065FDF4H找到a的存儲單元,從而對變數a進行訪問;二是按系統為pa分配的地址先找到pa,然後根據pa的值(即變數a地址0x065FDF4H)找到變數a在內存中的存儲單元,從而對變數a進行訪問。對於前一種訪問方式稱為直接訪問方式,後一種訪問方式稱為間接訪問方式。
如果一個指針變數存放的是某個對象的地址,則稱這個指針變數指向該對象。在C++程序設計中,指針變數只有確定了指向才有意義。
1. 定義指針變數的一般形式如下:
類型名*指針變數名1,*指針變數名2,... *指針變數名n ;
2. 空指針
空指針是一個特殊的指針,它的值是0,C語言中用符號常量NULL(在stdio.h中定義)表示這個空值,並保證這個值不會是任何變數的地址。空指針對任何指針類型賦值都是合法的。一個指針變數具有空指針值表示當前它沒有指向任何有意義的東西。
3. void指針
(void *)類型的指針叫通用指針,可以指向任何的變數,C語言允許直接把任何變數的地址作為指針賦給通用指針。但是有一點需要注意void*不能指向由const修飾的變數,eg const int test; void * ptv; ptv = &test;第三句是非法的,只有將ptv申明為const void * ptv;上述第三句(ptv = &test),才是合法的.
當需要使用通用指針所指的數據參加運算時,需要寫出類型強制轉換。如通用指針ptv 所指空間的數據是整型數據,p是整型指針,用此式轉換:p=(int *)ptv ;
⑥ 論述C語言中指針的概念和作用,並舉例說明
1、指針概念:變數的地址(計算機內存位元組的編號)叫做指針,存放變數地址的變數叫指針變
量,
簡言之,指針是用來存放地址的。
2、作用:指向這個變數或數組的首地址,是變數的間接引用方式。其值如果改變,變數的值或數組元素的值也會跟著改變。程序對變數的操作實際上是對變數所在的存儲空間讀取和寫入數據。方便對變數的操作。
舉例說明:
int
a=3;/*定義一個整型變數a,並賦初值3*/
int
*p;/*定義一個指針變數P*/
p=&a;/*讓p指向a的首地址,也就是a的地址*/
程序為a分配一個2個位元組的存儲單元,假如2個位元組的地址分別為(ABCD1和ABCD2,唯一),那麼p裡面放的值就是ABCD1,不是3。這時可通過p直接引用a,實際上*p=3。以後不管a存放在內存中的哪個地方,只用通過調用p就可以引用a。這時如果令*p=4,則最後的a值也為4。對於數組,指針是指向數組的首地址。
⑦ C++中指針中存放的是一個地址,那是不是可以理解為存放這個地址的這個內存空間也有一個地址
任何一個變數的本質都一樣,都是內存中的一段特定的空間。
所以指針變數與非指針變數在變數這個層面上是一樣的,沒區別的,區別體現在編譯系統如何理解運用變數中存儲的值,比如:
int a,*p
這里定義了兩個變數,a是一個int變數,p是一個指針變數,但是a和p存儲的其實都是一個數字。區別就在於 系統會 把p中存儲的數字當作一個地址去運用,從而跳轉到這個地址去操作其中的數據。
⑧ 指針變數存放的是內存地址,那為什麼指針還要定義類型
指針定義類型是為了取值及指針運算。
一、指針的本質為內存地址。不管什麼類型的指針,其本質都是內存地址。
二、定義指針類型,可以更方便的取值。
不管定義什麼指針,保存什麼樣的地址,其目的都不是為了獲取到這個地址值,而是為了訪問地址上的數據。 定義了指針類型,就可以很方便的取得數據。
如果指針p類型為long*型,那麼當使用*p取值時,就是取p值這個地址上,連續4個位元組的數據值。
而如果p類型為char *型,那麼使用*p 就是在p這個地址上的一個位元組數據。
三、定義指針類型,方便指針運算。
使用指針,最常用的操作除取值為,就是指針的移動,也就是加減運算。通過指針加減,可以很方便的訪問相鄰或者間接相鄰的同類單元。同樣的p+1, 不同指針移動的實際內存位元組數不同,其值為sizeof(指針指向類型)。
即 對於type * p; p+n的實際偏移地址值為sizeof(type)*n。