1. 程式人生 > >C語言指標的理解

C語言指標的理解

        對於C語言初學者而言,指標部分有點複雜,也有些難理解,可以說是C語言學習之路上的第一道坎,在閱讀了不少書籍資料和實驗後,決定寫下這篇部落格,供大家參考。

       什麼是指標?

 指標也是一種變數,存放的是某塊記憶體的地址。

我們知道,記憶體可以理解為是按位元組被分割成若干塊的,每一位元組都對應著一個編號,並且這些編號從小到大依次排列,這個編號就是它的地址,獨一無二,而指標變數中的值就是這些編號

 例如如下程式碼的結果

#include <stdio.h>
#include <Windows.h>
int main()
{
    int a = 0;
    int *p = &a;
    printf("%p", p);
    system("pause");
    return 0;
}

這就是一個指標變數的內容,一個16進位制數,代表著記憶體中某一個位元組的地址

指標解引用和取地址

int *p = &a 這行程式碼的意思是將變數a的地址賦給了整形指標變數p,

此時p中存放的是a的地址,而*p就是對指標進行解引用,*p指向p中所存放的地址中的值,即a本身。

對*p進行+1操作,相當於a+1。

&a意思是取a的地址,相當於p

這一塊的理解沒有難度,但對初學者來說也需要一定時間。

指標的型別

指標的型別很豐富,資料有多少種類型,指標就有多少種類型與之相對,除此之外還有陣列指標、函式指標、以及指向指標的指標,即二級指標。

一般來講,一種型別的指標中所儲存的是與之型別相對應的變數的地址。

同時,指標也可以進行強制型別轉換操作

int a = 0;
char *p = NULL;
(int *)p = &a;

這裡也可以看到,指標的初始化操作是賦值為NULL,表示空指標,指向0地址。

另外,有一種特殊的指標void*,表示不確定型別的指標,可以接受任意型別的指標,常用作函式的引數。

指標的大小

記住所有指標的大小都一樣,與型別無關,只與系統有關,在32位系統下,指標的大小為4個位元組,64位系統下,是8位元組。

指標的運算

指標作為一種變數是可以進行運算的,

指標加減整數後得到的結果是原地址加上或減去該型別大小的位元組數

#include <stdio.h>
#include <Windows.h>
int main()
{
	int a = 0;
	char *p1 = &a;
	short *p2 = &a;
	int *p3 = &a;
	long *p4 = &a;
	double *p5 = &a;
	printf("%p\n", p1);
	printf("%p\n", p1+1);
	printf("%p\n", p2-1);
	printf("%p\n", p3+1);
	printf("%p\n", p4-1);
	printf("%p\n", p5+1);
	system("pause");
	return 0;
}

上面程式碼的結果為

如果你對型別的位元組大小記得很熟的話,相信你一眼就可以看出指標的一個規律即

指標的型別決定了指標的操作許可權(多少位元組的範圍)

此時你是否有一個疑問,一個int型變數佔4個位元組,而指標只指向一個位元組,那賦值後指標指向的是4個位元組中的哪一個呢,答案是4個位元組中地址數最低的那一個

也可以稱這個最低的地址值是就是int型變數a的地址值。

指標除了加減整數,也可以加減指標,得到的值表示兩個變數在記憶體中存放位置的差值。

二級指標

這時我們應該已經可以得出一個結論,只要是我們所定義的變數,都被儲存在記憶體中,都有一個地址,並可以把它賦給一個指標變數。

那麼指標變數也不列外,它也有地址,也同樣可以被放在一個指標變數中,而這個指標變數就是我們習慣稱之為的“二級指標”。

int main()
{
	int a = 0;
	int *pa = &a;
	int **p = &pa;
	return 0;
}

在上面的程式碼中,二級指標p指向的是用於存放a的地址的指標pa,存放的是pa的地址。

**p等價於*pa等價於a。

指標與陣列

這是可以說是在C語言學習中,最難啃的一塊骨頭,我將另開一篇部落格陳述。

相關推薦

正確理解C語言指標中的 &a+1,假設a為一個數組

1.int a[5]={1,2,3,4,5}; int p=(int)(&a+1); printf("%d",*(p-1)); 答案為什麼是5? 這個問題的關鍵是理解 &a a是一個數組名,也就是陣列的首地址。 對a進行取地址運算子,得到的是一個指向陣列

C語言理解函式指標陣列和定義

函式指標陣列和定義 陣列是一個存放相同型別資料的儲存空間,那我們已經學習了指標陣列,比如:     int *arr[10];//陣列的每個元素是int* 那要把函式的地址存到一個數組中,那這個陣列就叫函式指標陣列,那函式指標的陣列如何定義呢?   int (

學習筆記:對C語言指標理解

在C語言中,有很多極易混淆的概念(比如:記憶體和指標、函式指標、指標函式、陣列指標、指標陣列),也正是這些概念使得很多人學習起來很累,今天,筆者分享一下自己對這些的概念的理解。 一、定義 1、記憶體:隨機存取儲存器,也叫主存,是與CPU直接交換資料的內部儲存器。 2、指

C語言指標理解

        對於C語言初學者而言,指標部分有點複雜,也有些難理解,可以說是C語言學習之路上的第一道坎,在閱讀了不少書籍資料和實驗後,決定寫下這篇部落格,供大家參考。        什麼是指標?  指標也是一種變數,存放的是某塊記憶體的地址。 我們知道,記憶體可以理解

C語言指標的形象理解-----/*自己編寫*/

什麼是變數?所謂變數,不要淺顯的認為會變得量就是變數。套用我們院長的問話:“教室變不變?”變,因為每天有不同的人在裡面上課,但又不變,因為教室始終在那,沒有變大或變小。這就是變數:有一個不變的地址和一塊可變的儲存空間。正常情況下,我們只看到變數這個房間裡面的東西,也就是其內容,但不會關注變數的地址,但是C語

【好程式設計師筆記分享】—— C語言指標理解

對於C語言中指標是非常重要的內容,也是C語言的魅力所在。下面我們來看一段程式碼理解指標: #include <stdio.h> int main(int argc, const char * argv[]) { //定義int型別的變數a

C語言 指標和二級指標理解

1.變數的值存在計算機記憶體中,每個記憶體地址都由位置唯一確定;指標相當於這個位置的別名。實質:指標即是地址。 2.一個變數的值是:分配給該變數記憶體中所儲存的資料。 3.指標也是變數,叫做指標變數。 舉個例子: int a=12; int *b=&a; int *

C語言指標訓練

去空字串 1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 6 char * removeSpace(c

嵌入式C語言--指標與字串

使用指標這一工具來操作字串。 定義字串變數的初始化方法 char *strptr = "liefyuan"; char strarray1[] = "liefyuan"; char strarray2[8] = "liefyuan"; char strarray3[8] = {'

C語言指標實現兩個數的互換

#include <stdio.h> void change1(int a, int b)//形參與實參不是同一個變數{ int t; t = a; a = b; b = t; } void change2(int * a, int * b)//只是把兩個變數的地址儲存的位置換了,但是變數的值

C語言 指標實現字串連線

C語言 指標實現字串連線 #include <stdio.h> #include <string.h> int main() { char s1[100], s2[100], s3[100]; char *p1=NULL; char *p2=NULL; char

組合語言程式設計( 利用c語言快速理解彙編)

文章目錄 組合語言程式設計 一 操作碼和運算元 1 操作碼 2 運算元 3 語句格式 4 源程式框架 庫函式 二 資料定址方式 子程式

C語言指標實現計算平均分等功能

4個學生5門課資料自己輸入,輸出第一門的平均分,並找出有兩門以上課程不及格的學生和平均成績在90分以上的或全部課程成績在85分以上的學生。程式不難,容易理解,但關鍵是思路要清楚。裡面涉及大量的指標的定義使用,多敲點這樣過百行的程式為以後大程式打基礎。程式碼如下: #include<iost

C語言指標——對普通變數的指標操作和對陣列(常量)的指標操作

       我們知道,每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可使用連字號(&)運算子訪問的地址,它表示了在記憶體中的一個地址。        我們喜歡在程式中使用指標代替陣列,因為變數指標可

c語言-指標陣列

指標 記憶體和地址怎麼理解呢? 機器中有一些位置,每一個位置被稱為【位元組】/byte,許多現代機器上,每個位元組包含8個位。更大記憶體單位【字】,通常包含2個或4個位元組組成。 一個字包含4個位元組,它的地址是什麼? 他仍然只有一個地址,是最左邊還是最右邊的那個位元組的位置,取

c語言指標探祕

今天寫AVL樹的時候突然出了個bug,死活找不出來,後來百度了一下發現是用指標傳當形參的時候指標指向的內容不會變化的,有點類似於直接傳值,所以打算好好總結一下c語言指標的知識。 首先,我們一起來看一下指標的基本知識 int main() { int *p; int a = 666; p

C語言 指標基礎篇 陣列,函式與指標的運用 2 14

下面看看如何在函式中運用指標吧  下面是往函式傳入指標的簡單操作,不是傳入陣列的。判斷一個a是否大於b是的話給,是的話對其進行操作,不是的話就直接返回。 1 #include <stdio.h> 2 int main(){ 3 int num1,num2,*p1,

C語言指標詳解(經典,非常詳細)

C語言指標詳解(經典,非常詳細) 前言:複雜型別說明     要了解指標,多多少少會出現一些比較複雜的型別,所以我先介紹一下如何完全理解一個複雜型別,要理解複雜型別其實很簡單,一個型別裡會出現很多運算子,他們也像普通的表示式一樣,有優先順序,其優先順序和運算優先

C語言指標描述

C語言  指標語法 #include<stdio.h> #include<stdlib.h> main(){ int a=10; int* pointer=&a; } C語言裡面的指標只能操作地址  

18. C語言 -- 指標陣列和陣列指標

本部落格主要內容為 “小甲魚” 視訊課程《帶你學C帶你飛》【第一季】 學習筆記,文章的主題內容均來自該課程,在這裡僅作學習交流。在文章中可能出現一些錯誤或者不準確的地方,如發現請積極指出,十分感謝。 也歡迎大家一起討論交流,如果你覺得這篇文章對你有所幫助,記得評論、點贊哦 ~(。