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)
{
………………
} |
Main()
{ 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)!=’\0’ i++)
{*(B+i)=*(A+i);}
*(B+i)=’\0’;
)
Cout<<B; 或者for(i=0;b[i]!=’\0’;i++) {cout<<B[i]}
12. 字符串指针做函数参数
12.1 void copy_string(char from[],char to[])
{ int I;
while(from[i]!=’\0’)
{ to[i]=from[I];i++ }
to[i]=’\0’;
}
12.2 void copy_string(char *from,char *to)
{ for(;from!=’\0’;from++,to++)
*to=*from;
*to=’\0’;}
while ((*to=*form)!=’\0’)
{ to++; from++} ;
While((*to++=*from++)!=’\0’);
while(*form !=’\0’)
{ *to++=*from++;}
*to=’\0’ ;
分析 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;
}
}
}
}