C語言—————指標細論【1】
一、指標 1.地址 記憶體單元的編號叫地址; 2.指標 記憶體單元的地址叫指標; 變數的地址叫指標; 3.指標變數 儲存變數地址的變數叫指標變數; 說明: 在不作區分的情況下,將地址 指標 指標變數統稱指標; 4.指標變數的形式 儲存型別 資料型別 *指標變數名; eg: int *p; 說明: 儲存型別:同普通變數,指標變數本身的儲存型別; 資料型別:既可以是基本型別,也可以是struct,也可以是void,還可以是指標; 此資料型別是指標指向空間內容的資料型別;(重點) *:表示變數為指標變數; 指標變數名:符合命名規則; 5.指標變數的初始化 儲存型別 資料型別 *指標變數名 = 地址值; eg1: int i = 10; int *p = &i;//由於p指標指向的資料為int 型,所以需要給指標變數p賦int型變數的地址; eg2: char ch = 'a'; char *q = &ch; 6.& 與 * &:取變數的地址 *: 1> 在定義指標變數時,*用來說明定義的變數為指標變數; eg: float *p;//*說明定義的變數p為指標變數; 2> 在定義之後,指標變數名前加*,含義是取指標指向空間的值;(解引用) eg: int i = 10; int *p; p = &i;//給指標變數p賦i的地址 printf("i=%d *p=%d\n",i, *p); 注意: & 與 *互為逆運算; eg: int i = 10; printf("%d\n",*(&i));//結果10 7.指標的運算 本質:地址的運算 定義指標變數 px和py; 1> 算數運算:(+ - ++ --) px+n:指標向地址大的方向偏移n個數據型別;(此資料型別為指標指向內容的資料型別) px-n:指標向地址小的方向偏移n個數據型別;(此資料型別為指標指向內容的資料型別) px++://等價:px=px+1;指標向地址大的方向移動1個數據型別;(此資料型別為指標指向內容的資料型別) px--:指標向地址小的方向移動1個數據型別;(此資料型別為指標指向內容的資料型別) px-py:兩指標之間相差的資料型別的個數; eg: int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p = &a[0];// int *q = &a[7]; printf("p=%p p+3=%p\n",p,p+3);//p=0xbffb8334 p+3=0xbffb8340 printf("q=%p q-3=%p\n",q,q-3);//q=0xbffb8350 q-3=0xbffb8344 printf("q-p=%d\n",q-p);//q-p=7 注意: n為整數 2> 關係運算(> < >= <= == !=) eg1: int *p;//"野指標" *p = 10;//不允許通過野指標訪問野指標指向的空間; eg2: int *p = NULL;//stdio.h定義的巨集值 #define NULL 0 if(NULL == p)//判斷指標是否為有效的指標 { return ; } *p = 10;//ERROR 3> 賦值運算 eg1: int i = 10; int *p = &i; eg2: int i = 10; int *p = &i; int *q = p; eg3: int a[10]; int *p = a; 二、指標與陣列 通過指標運算元組; 1、一級指標與一維陣列 eg: int a[10] = {1,2,3,4,5,6,7,8,9,10}; int *p = a;//int *p = &a[0]; int i; for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); for(i=0;i<10;i++) printf("%d ",p[i]); printf("\n"); 結論: 1> 陣列中第i個元素的表示:(i=0,1,2,.....) a[i] p[i] *(a+i) *(p+i) *(&a[i]) *(&p[i]) 2> 陣列中第i個元素的地址的表示:(i=0,1,2,.....) &a[i] &p[i] (a+i) (p+i) 三、字元指標 1.形式 儲存型別 char *指標變數名; eg1: char ch = 'a'; char *p = &ch;// *p = 'b'; printf("*p=%c\n",*p); eg2:字元指標操作字串(重點) char *p = "hello world";//將字串的首地址賦給p指標 printf("*p=%c\n",*p);//*p='h' *p = 'a';//ERROR 不能通過指標修改常量區的東西 例子: char *p; p="hello world"; printf("*p=%c\n",*p);//*p='h' printf("p=%s\n",p);//p=hello world printf("*p=%p\n",*p);//p=0x80484f0"字串首地址" eg3:字元指標的賦值 char *p = NULL; p = "hello world"; eg4: char ch[20] = "hello world";(√) char ch1[20]; ch1 = "hello world";(×)//陣列名不能作為左值 eg5: char ch1[20]; ch1[20] = "hello world";(×)//ch1[20]表示的是陣列ch1中的第21個元素,越界 eg6: char ch[20] = "hello world";//將常量區的"hello world"拷貝一份到ch的空間 *ch = 'a'; printf("%s\n",ch);//結果:aello world
例項: 1、求一個字串的長度。(指標)
#include<stdio.h>
int main() { char ch[64]; gets(ch);
int num=0; char *p = ch;
while(*p != '\0') { num++; p++; }
printf("num=%d\n",num);
return 0; }
2、計算一個字串的空格數,並刪除全部空格; #include<stdio.h>
int main() { char a[64]; gets(a);
int i,j,num=0; for(i=0;a[i]!='\0';i++) { if(a[i] == ' ') { num++; for(j=i;a[j]!='\0';j++) a[j] = a[j+1]; i--; } } printf("num=%d %s\n",num, a);
return 0; }
3、用指標給一個數組賦值,並列印。 #include<stdio.h>
int main() { int a[10]; int len = sizeof(a) / sizeof(int); int *p = a; int i; for(i=0;i<len;i++) scanf("%d",p++); p = a;
for(i=0;i<len;i++) printf("%d ",p[i]); printf("\n");
return 0; }