C語言筆記 指針
1. 程序定義一個變量,分配內存. 內存單元地址與內存單元內容的不同
2. 變量的地址就是變量的指針.
3. 一個變量專門存放另外一個變量的地址,稱之為指針變量.
4. 如何定義:
int i, int j ;
int *Pointer_i, *Pointer_j;
定義的指針變量,是專門用來存放地址的.int *Pointer_i;是定義一個指針類型.
賦值語句
Pointer_i=&i; Pointer_j=&j;
(1) &:取地址運算符 (2): * 指針運算符 (3): [] 變地址運算符
#include<stdio.h>
Void main()
{ int a,b;
int *P1,* P2 /* 定義了兩個指針變量,P1/P2,專門用來存放地址 */
P1=&a;P2=&b; /*P1指向a,P2指向b.*/
printf(“%d,%d”,*P1,*P2); /*輸出P1指向的變量a,輸出P2指向的變量b*/
}
5. P1=&*P2; P2指向B的地址,P1指向A的地址,經過賦值,P1指向B的地址
6. *&a 先進行&a運算,得a地址,再進行*運算.&a(地址)指向得變量. *&a得作用和*P1作用一樣, *&a和a等價
7. 交換專題
Swap(int *p1,int*p2)
{ int *p;p=p1; p1=p2; p2=p;
}
Swap(int p1,int p2)
{ int temp; temp=p1;p1=p2;p2=temp;
}
如果直接調用,則主函數得實參沒有進行交換.
C/C++ 應該運用
Swap1(int *p1,int*p2)
{ int temp; temp=p1;p1=p2;p2=temp; } /* 指針調用
Swap2(int &p1,int&p2){int temp; temp=p1;p1=p2;p2=temp;} /* 引用調用
8. 指向數組元素得指針
int a[10]; int *p; p=&a[0]; // p=&a[0] 和 p=a 等價, int *p=a;
如果P=a; 那么p+1 指向a[1], p+2 指向a[2]; 所代表實際地址p+1*d (d 表示所占字節數,整型2 實型4 字符型 1)
如果p=&a[0], p+i 和a+i 等價均指向 a[i]的地址; *(p+i)和*(a+i) 均是 a[i]的數組元素
8.1 下標法a[i]
8.2 指針法 *(a+i) 和 *(p+i), a是數組名,P是指向數組的指針變量 初值 P=a;
用數組名做函數參數
F(int a[]) 和 F(int *a) 等價
形參和實參都用數組名
Main()
{ int a[10];
……
F(a,10)
}
Main()
{ int a[10];
F(a,10)
}
F(int *x, int n) { ……………… }
{ int a[10]; int *p
P=a;
F(p,10)
}
多維數組
a[i][j]
a[0]值是 &a[0][0] a[1] 的值是&a[1][0] a[2]的值是&a[2][0] a[3]是&a[3][0]
a是&a[0][0] a[0]+1 是 &a[0][1] a[0]+j &a[0][j]
a+1 是 &a[1][0] a[1]+1 是 &a[1][1] a[1]+j &a[1][j]
a+2 是 &a[2][0] a[2]+1 是 &a[2][1] a[2]+j &a[2][j]
a+i 是 &a[i][0] a[i]+j 就是 &a[i][j]
*(*(a+i)+j)是 a[i][j]的值
*(a[i]+j)或 *(*(a+i)+j) 等價
*(*a+1) 就是a[0][1]的值 或者說 *(*a+j)
a[1]+2 和*(a+1)+2 和 &a[1][2] 取地址
*(a[1]+2) 和*(*(a+1)+2) 和 a[1][2] 取值
二維數組
A[i][j] 其中 A[i] 實際上是地址,A是第0行第0列地址,A[i]是 第I行地址第0列地址
9. int (*P)[4] 表示P 是一個指針變量,它指向包含4個元素的一維數組
10. int *p[4] 表示一個指針數組
11. 字符串表現形式
11.1用字符數組存放字符串,輸出該字符串
#include<iostream.h>
main()
{ char string[]=”l over you my beau MEIMEI”
Cout<<string;
}
11.2 用字符指針指向一個字符串
#include<iostream.h>
Void main()
{ char *string=”I love you my MEIMEI”
Cout<<string;
}
字符串之間的COPY
int A[]=”I LOVE YOU ”
int B[50]
int I;
for(i=0;*(A+i)!=’\
{*(B+i)=*(A+i);}
*(B+i)=’\
)
Cout<<B; 或者for(i=0;b[i]!=’\
12. 字符串指針做函數參數
12.1 void copy_string(char from[],char to[])
{ int I;
while(from[i]!=’\
{ to[i]=from[I];i++ }
to[i]=’\
}
12.2 void copy_string(char *from,char *to)
{ for(;from!=’\
*to=*from;
*to=’\
while ((*to=*form)!=’\
{ to++; from++} ;
While((*to++=*from++)!=’\
while(*form !=’\
{ *to++=*from++;}
*to=’\
分析 char *a;
cin>>a; 危險性
函數指針 和指向函數的指針變量
用函數指針變量調用函數
13. main()
{ int max(int,int)
int (*p)(int, int)
int a,b,c;
c=(*p)(a,b) //P先與*結合,表示一個指針變量,然后與()結合,表示指針變量指向函數
// int *p() //P與()結合,聲明一個函數,返回值指向整型變量的指針
}
14. 用指向函數的指針做函數參數
SUB(int, int, int(*p)(int x,int y), int(*q)(int a, int b))
{ int max(int x,int y);
int min(int x,int y);
int add(int x,int y);
int Proress(int x,int y ,int(*)P(int x,int y))
}
15. 返回指針值的函數
int * sub(int x,int y)
{}
16. 指針數組
類型名 *數組名【數組長度】 // int *p[4] 每個數組元素(相當于一個指針變量)都可以指向一個整型變量
17. 指向指針的指針
例題:
#include<string>
#include<iostream.h>
void main()
{ void sort( char *name[],int n);
void print(char *name[],int n);
char *a[]={“woaini”,”tushuguanli”,”wosafsat”,”adsao”};
int n=4;
sort(name,n);
print(name,n)
}
void sort(char *name[],int n)
{ char *temp;
int i,j,k;
for(i=0;i<n;i++)
{ k=i;
for(j=i;j<n-1;j++)
{ if(strcmp(name[k],name[j])>0) k=j;
if(k!=i)
{
temp=name[i];
name[i]=name[k];
name[k]=temp;
}
}
}
}