说一下指针的基本用法,(主要是给自己写的,不一定符合大家的胃口欧)
一、指针易错
下面是需要注意的。
在使用已定义好的指针变量时,在变量名前面不能加 *。例如:
- int *p,a;
- *p=&a; //错误,指针变量是p而不是*p
而如下语句是正确的。
- int a,*p=&a; //正确
该语句貌似把 &a 赋给了 *p,而实际上 p 前的 * 仅是定义指针变量 p 的标识,仍然是把 &a 赋给了 p,故是正确的赋值语句。
二、指针与一维数组
指针
#include<stdio.h> #include<stdlib.h> #include<string.h> void paixu(int *p,int n) { int *i,*j,t; i=p;j=p+n-1; for(;i<=j;i++,j--) { t=*i; *i=*j; *j=t; } } int main() { int n,*q1,*q2; scanf("%d",&n); q1=q2=(int *)malloc(n*sizeof(int)); for(int i=0;i<n;i++) { scanf("%d",q1); q1++; } paixu(q2,n); for(int i=0;i<n;i++) {printf("%d ",*q2);q2++;} }
三、指针与字符串
#include<stdio.h> #include<stdlib.h> #include<string.h> void paixu(char **p,int n) { char a[100]; for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++) { int l=strcmp(p[i],p[j]); if(l>0) { strcpy(a,p[i]); strcpy(p[i],p[j]); strcpy(p[j],a); } } } } int main() { int i,n; char t[100],*p[20]; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s",t); int l=strlen(t); p[i]=(char *)malloc((l+1)); strcpy(p[i],t); } paixu(p,n); for(i=0;i<n;i++) { printf("%s",p[i]); printf(" "); } }
四、(1)指针和二维数组
初步来理解指针和二维数组,就拿a【3】【4】和指针来举例子,就如上表列出来的。分为行指针和列指针。行指针可以通过取星来换成列指针,比如,a表示第0行的首地址,*(a)=*(a+0)+0=a【0】表示第零行第〇列的地址。
因此我们可以将二维数组换成指针来表示。比如,a【1】【2】的地址就可以用*(a+1)+2来表示,然后如果是表示元素再在前面取星就行啦。
举个例子:
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*p)[4]=a;//定义一个数组指针是指向含 N 个元素的一维数组的指针 for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { printf("%d ",*(*(p+i)+j)); } printf(" "); } }
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int n,i,j; float (*q1)[3],*q2; scanf("%d",&n); q1=(float(*)[3])malloc(n*3*sizeof(float)); q2=q1[0];//将q1的首行首列给q2, for(i=0;i<n;i++) { for(j=0;j<3;j++) { scanf("%f",*(q1+i)+j); } } for(i=0;i<n*3;i++,q2++) { printf("%f",*q2); } return 0; }