C語(yǔ)言筆記 指針
1. 程序定義一個(gè)變量,分配內(nèi)存. 內(nèi)存單元地址與內(nèi)存單元內(nèi)容的不同
2. 變量的地址就是變量的指針.
3. 一個(gè)變量專(zhuān)門(mén)存放另外一個(gè)變量的地址,稱(chēng)之為指針變量.
4. 如何定義:
int i, int j ;
int *Pointer_i, *Pointer_j;
定義的指針變量,是專(zhuān)門(mén)用來(lái)存放地址的.int *Pointer_i;是定義一個(gè)指針類(lèi)型.
賦值語(yǔ)句
Pointer_i=&i; Pointer_j=&j;
(1) &:取地址運(yùn)算符 (2): * 指針運(yùn)算符 (3): [] 變地址運(yùn)算符
#include<stdio.h>
Void main()
{ int a,b;
int *P1,* P2 /* 定義了兩個(gè)指針變量,P1/P2,專(zhuān)門(mén)用來(lái)存放地址 */
P1=&a;P2=&b; /*P1指向a,P2指向b.*/
printf(“%d,%d”,*P1,*P2); /*輸出P1指向的變量a,輸出P2指向的變量b*/
}
5. P1=&*P2; P2指向B的地址,P1指向A的地址,經(jīng)過(guò)賦值,P1指向B的地址
6. *&a 先進(jìn)行&a運(yùn)算,得a地址,再進(jìn)行*運(yùn)算.&a(地址)指向得變量. *&a得作用和*P1作用一樣, *&a和a等價(jià)
7. 交換專(zhuān)題
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;
}
如果直接調(diào)用,則主函數(shù)得實(shí)參沒(méi)有進(jìn)行交換.
C/C++ 應(yīng)該運(yùn)用
Swap1(int *p1,int*p2)
{ int temp; temp=p1;p1=p2;p2=temp; } /* 指針調(diào)用
Swap2(int &p1,int&p2){int temp; temp=p1;p1=p2;p2=temp;} /* 引用調(diào)用
8. 指向數(shù)組元素得指針
int a[10]; int *p; p=&a[0]; // p=&a[0] 和 p=a 等價(jià), int *p=a;
如果P=a; 那么p+1 指向a[1], p+2 指向a[2]; 所代表實(shí)際地址p+1*d (d 表示所占字節(jié)數(shù),整型2 實(shí)型4 字符型 1)
如果p=&a[0], p+i 和a+i 等價(jià)均指向 a[i]的地址; *(p+i)和*(a+i) 均是 a[i]的數(shù)組元素
8.1 下標(biāo)法a[i]
8.2 指針?lè)?/SPAN> *(a+i) 和 *(p+i), a是數(shù)組名,P是指向數(shù)組的指針變量 初值 P=a;
用數(shù)組名做函數(shù)參數(shù)
F(int a[]) 和 F(int *a) 等價(jià)
形參和實(shí)參都用數(shù)組名
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)
}
多維數(shù)組
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) 等價(jià)
*(*a+1) 就是a[0][1]的值 或者說(shuō) *(*a+j)
a[1]+2 和*(a+1)+2 和 &a[1][2] 取地址
*(a[1]+2) 和*(*(a+1)+2) 和 a[1][2] 取值
二維數(shù)組
A[i][j] 其中 A[i] 實(shí)際上是地址,A是第0行第0列地址,A[i]是 第I行地址第0列地址
9. int (*P)[4] 表示P 是一個(gè)指針變量,它指向包含4個(gè)元素的一維數(shù)組
10. int *p[4] 表示一個(gè)指針數(shù)組
11. 字符串表現(xiàn)形式
11.1用字符數(shù)組存放字符串,輸出該字符串
#include<iostream.h>
main()
{ char string[]=”l over you my beau MEIMEI”
Cout<<string;
}
11.2 用字符指針指向一個(gè)字符串
#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. 字符串指針做函數(shù)參數(shù)
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; 危險(xiǎn)性
函數(shù)指針 和指向函數(shù)的指針變量
用函數(shù)指針變量調(diào)用函數(shù)
13. main()
{ int max(int,int)
int (*p)(int, int)
int a,b,c;
c=(*p)(a,b) //P先與*結(jié)合,表示一個(gè)指針變量,然后與()結(jié)合,表示指針變量指向函數(shù)
// int *p() //P與()結(jié)合,聲明一個(gè)函數(shù),返回值指向整型變量的指針
}
14. 用指向函數(shù)的指針做函數(shù)參數(shù)
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. 返回指針值的函數(shù)
int * sub(int x,int y)
{}
16. 指針數(shù)組
類(lèi)型名 *數(shù)組名【數(shù)組長(zhǎng)度】 // int *p[4] 每個(gè)數(shù)組元素(相當(dāng)于一個(gè)指針變量)都可以指向一個(gè)整型變量
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;
}
}
}
}