这次学习了c语言开发的第八章----指针。这一章对于我来说还真是挺有难度的,很多的概念都弄模糊了,导致自己的理解出现了偏差,对于指针,虽然写完了这一章,但对于他还是没有很好地理解,我觉得自己还需要多看点关于这方面的书以及一些大佬的讲解视频才行,自己现在只学了一些皮毛,难的都还没有去接触。
这一章,要求我们掌握一下几点:
1.指针的相关概念;
2.指针的运算;
3.数组和指针的相关操作;
4.字符指针和字符指针数组的使用;
5.了解指向指针的指针;
6.了解函数型指针的使用;
首先,了解到指针变量(有一个变量专门用来存放另一变量的地址),它的一般格式:类型声明 *变量名;其中,“*”表示这是一个指针变量。对于指针的赋值,给指针变量只能赋予地址,方法有以下两种:
1.int a;
int *p=&a;
2.int a;
int *p;
p=&a;
接下来说说一维指针和数组,当定义一个一维数组的时候,系统会在内存中为该数组分配一个存储空间,数组名称就是数组在内存中的首地址,在定义一个指针变量,将数组首地址传给指针变量,该指针就指向一维数组了。例如:
1.int *p,a[10];
p=a;
2.int *p,a[10];
p=&a[0];
以上两种赋值操作的效果完全相同。p+n与a+n表示数组元素a[n]的地址,*(p+n)和*(a+n)则表示数组中各元素。
接着就是指针访问二维数组:
&a[m][n]可以看做是第m行n列元素的的地址,a[m]+n表示第m行第n各元素的地址,在二维数组中,*(*(a+n)+m)与*(a[n]+m)都表示第n行第m列元素。(注:利用指针应用二维数组关键要记住*(a+i)与a[i]是等价的)。
例题如下:
1.使用指针交换两个数组中的最大值。
代码如下:
#include<stdio.h>
int *Max(int *p,int n)
{
int i,*max;
max=p;
for(i=0;i<n;i++)
{
if(*(p+i)>*max)
max=p+i;
}
return(max);
}
void change(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
int main()
{
int c[5],d[5],i;
int *a,*b;
printf("please input c:\n");
for(i=0;i<5;i++)
{
scanf("%d",&c[i]);
}
printf("please input d:\n");
for(i=0;i<5;i++)
{
scanf("%d",&d[i]);
}
a=Max(c,5);
b=Max(d,5);
change(a,b);
printf("now c:\n");
for(i=0;i<5;i++)
{
printf("%2d",c[i]);
}
printf("\n");
printf("now d:\n");
for(i=0;i<5;i++)
{
printf("%2d",d[i]);
}
printf("\n");
}
2.使用指针实现逆序存放数组元素值。
代码如下:
#include<stdio.h>
void back(int *p,int n)
{
int *j,*k,*b,t;
j=p;
k=p+n-1;
b=p+(n-1)/2;
for( ;j<=b;j++,k--)
{
t=*j;
*j=*k;
*k=t;
}
}
void main()
{
int a[5],i;
printf("input a:\n");
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
back(a,5);
for(i=0;i<5;i++)
{
printf("%2d",a[i]);
}
printf("\n");
}