程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中的指針學習(小黑板),指針黑板

C語言中的指針學習(小黑板),指針黑板

編輯:關於C語言

C語言中的指針學習(小黑板),指針黑板



 

指針是C語言中的精華所在,也是C語言的危險之在,今天又重現溫習了一下C語言,做了一下總結。

歡迎批閱。

 


 

(1)指針的含義
指針的本質也是數據類型,它是指向地址的變量。
例如:

{
  int a = 10;
  int *b = &a;//取a的地址
}

以下為內存顯示

地址 存儲變量 存儲的值
F1----> a(整形數據)<---10
F2----> b(指針類型)<---a的地址

所以應該注意的一點是指針類型數據要賦初值,不然會有危險

如果只聲明指針變量而不作操作那麼它本身的值就是存儲區上一次程序遺留的值,
此刻他便被當為地址,如果你給此地址指向的變量賦值可能會修改系統內部東西,
這就是C語言的指針操作的危險性。
例如:

{
  int *a;
  *a = 10;
}

在內存中

F1----> a (指針類型)<--- 內存本身的值(作為地址數據)

如果內存本身的值為00則他指向系統程序開始的那一部分

則你的賦值語句就是將00地址區域賦值為10則出現錯誤

注意:int* p,q;的意思是聲明指針P聲明int型變量q

(2)指針的應用
指針一般有兩種常用應用
1>函數要返回多個值時,一個單純的return就解決不了問題,需要用指針進行值傳遞。
函數傳遞的參數就是要保存結果的值。

swap(int *a,int *b)
{
    int c = 0;
    c = *a;
    *a = *b;
    *b = *a;
}

2>函數需要返回狀態(就是函數操作是否成功)時需要用指針傳遞結果,用return返回操作狀態

例如:除法的函數

void chufa(int a,int b,int *result)
{
    if(b == 0)
    {
         return 0;
    }
    else
    {
        *result = a/b;
         return 1;
    }
}

(3)數組變量參數的含義

如下面的例子,聲明了一個數組,則a其實就代表著數組a的起始地址,也就是a[0]的地址
則a就成為了指針型變量參數。

{
    int ar[5];
    int P = &ar[0];//int P = ar
    //下面四種表示的含義相同,第一個參數進去的都是數組的首地址
    int sum(int ar[],int n);
    int sum(int [],int);
    int sum(int *ar,int n);
    int sum(int *,int);	
}

內存中的顯示

F1----ar[0]
F2----ar[1]
F3----ar[2]
F6----*P <----F1(ar[0]的地址)
則 p+1 <----F2 P+2 <----F3
*(P+1) = ar[1]
注意:數組ar是常量指針也就是const不能被賦值和改變!

(4)關於const與指針的關系
兩種表示形式
1>
int *const q = &i;//q是const型指針
則q不能改變,可以對*q進行賦值,但不能改變q
2>
const int *p1 = &i;//表示不能通過*q去修改i
下面幾種情況的區分要看const與*的位置關系,如果const在*的後面則表示指針不可修改。
反之則不能通過*p進行賦值
const int* p1 = &i;
int const* p2 = &i;
int *const p3 = &i;

應用:在函數中經常在數組型參數前面加const用以保護數組不受破壞。

(5)指針的運算
1>加一減一
int *a = &i;
a++;//a地址加一個int長度
a--;//a地址減一個int長度
在內存中這樣
0xffffff64 ----> i

a = 0xffffff64
a++ 運算後a變為 0xffffff68
a-- 運算後a變為 0xffffff60

2>減法
兩個相同類型的指針變量相減結果為他們相差多少倍的int的數據寬度

3>*P++運算
先賦值再加一。

4>比較運算
比較大小 > < == !=

5>void *p指針
代表含義是指針指向一塊不知道大小的區域


//malloc動態內存分配

#include <stdlib.h>
int main()
{
	int number;
	int *a;
	printf("請輸入數量");
	scanf("%d",&number);
	a = (int*)malloc(number*sizeof(int));//動態內存申請
	for(int i=0;i<number;i++)
	{
		scanf("%d",a[i]);
	}
	/*使用*/	
	free(a);//釋放內存
	return 0;
}

(6)指針與二維數組介紹

char a[10][10];//聲明二維數組
char **P = &a[10][10];

指針變量    數組首地址形成一列                數組區域a[][]
P       ------->    a[0]      -------->   [第一行數組]//a[0]為二維數組的第一行首地址
p+1  ------->    a[1]      -------->   [第二行數組]//a[1]為二維數組的第二行首地址
p+2  ------->    a[2]


所以
P是a[0]的地址,a[0]是第一行數據的首地址。
故P是指針的指針。
以下例子:
*P 是 a[0]
**p 是 a[0][0]
*(*p+1) 是 a[0][1]

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved