指针一些理解
说一下指针的基本用法,(主要是给自己写的,不一定符合大家的胃口欧)
一、指针易错
下面是需要注意的。
在使用已定义好的指针变量时,在变量名前面不能加 *。例如:
- 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("\n");
}
}
四、(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("\n"); } }
#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; }
成功不是偶然的,失败也不是必然的。

浙公网安备 33010602011771号