這兩天復習了一下C語言中的指針,發現很多東西幾乎全忘了,然後在CodeBlocks中打印一些小程序,進行知識的恢復,以後再忘了,就到自己的博客中來查看下,順便給一些剛學習C語言的同學一個參考,有不對的地方還請大家來指正,有疑問的請給阿濤留言。
一:五個重點概念
int *a;
int **a;
(1)指針的類型:指針本身自己的類型,如上兩個指針,指針類型就是:int *, int **
判斷方法:將定義的標識符拿掉,剩下的就是指針的類型
(2)指針指向的類型:指針指向的空間存儲的數據的類型,如上兩個指針,指針所指向的類型是:int int*
判斷方法:將定義的標識符和左邊的第一個*號拿掉,剩下的就是指針所指向的類型,這個類型決定了編譯器對
這個指向的內存空間中的數據作為什麼類型進行處理。
(3)指針所指向的內存空間:由於指針的值就是地址,這個值就是所指向的內存空間的首地址,那麼這個地址空間
有多大呢?然後就需要看你所指向的是什麼類型了。比如: int a; char b;
int *ptra=&a; char*ptrb=&b;
那麼,ptra指向的空間大小就是一個int的大小,4個字節,ptrb指向的空間大小就是一個char類型的大小,一個
字節。
(4)指針的內存空間:指針也是一種數據類型,本身自然也有大小,但是不論什麼樣的指針,在32位下的系統中統
統都是4個字節。因為32位下的地址都是32位的。
(5)指針本身的地址:指針自己也有自己的地址,通過&取地址符也可以打印出來。
下面是我打印的一些小程序,大家可以copy下來挨個運行下,看看差異:
#include <stdio.h>
#include <stdlib.h>
int fun(int num);
int (*fun1)(int num);//指針函數
void swap(int *a,int *b);
int main()
{
/*指針遍歷數組
int a[5]={1,2,3,4,5};
int *aptr=b;
for(i=0;i<5;i++)
{
printf("%d\n",(*aptr));
(*aptr)++;
aptr++;
}
for(i=0;i<5;i++)
{
aptr--;
printf("after:%d\n",(*aptr));
}*/
/*指針遍歷char類型數組
char b[5]={'a','b','c','d','e'};
int *ptr=b;
ptr++;
printf("%c\n",(*ptr));
*/
/*32位下所有指針都是4個字節
char *a;
printf("%d",sizeof(a));
*/
/*將地址賦給指針,&是取地址符,&也可以將指針的地址取出來
int a=10;
int *ptr=&a;
printf("%d\n",&a);
printf("%d\n",&(*ptr));
printf("%d\n",ptr);
printf("%d\n",&ptr);
*/
/*雙指針
int a=10;
int **ptr;
*ptr=&a;
**ptr=20;
printf("%d\n",**ptr);
*/
/*int 變量剛聲明就賦給了空間,但是剛開始是個亂值。
int a=0;
printf("%d\n",sizeof(a));
printf("%d\n",&a);
*/
/*數組名可以當做指針
int a[5]={1,2,3,4,5};
printf("%d\n",*(a+2));
*/
/*指針和結構體.結構體內的變量不能賦值,結構體可以定義在任何地方,
但是後面必須有分號
struct str
{
int a;
int b;
int c;
};
struct str s;
s.a=100;
struct str*ptr=&s;
printf("%d\n",ptr->a);
*/
/*指針函數
fun1=fun;
int a=fun1(5);
// int a=(*fun1)(5);經過測試也可以
printf("%d\n",a);
*/
/*指針自己的地址是不會改變的
int a[3]={1,2,3};
int *ptr=a;
printf("%d\n",ptr);
printf("%d\n",&ptr);
ptr++;
printf("after:%d\n",ptr);//指針指向的地址,增加了4
printf("after:%d\n",&ptr);//指針的地址,沒有改變
*/
/*指針轉換
float a=13.8;
//int*pa=&a;不經轉換,打印出來是錯誤的
//int *pa=(int*)&a;//經過轉換也是不行的,指針是不能相互轉換的
printf("%d\n",a);//應當是%f,不然還是亂的數據
*/
int a=100;
int b=200;
int *pa=&a;
int *pb=&b;
swap(pa,pb);
printf("%d %d\n",*pa,*pb);
return 0;
}
int fun(int num)
{
return num;
}
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}