学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
学习日记
前言
指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。
一、通过指针引用数组
1、数组元素的指针
int a[10]={1,3,5,7,9,11,13,15,17,19}; //定义a为包含10个整型数据的数组
int *p; //定义p为指向整型变量的指针变量
p=&a[0]; //把a[0]元素的地址赋给指针变量p
| p | &a[0] | → | 1 | a[0] |
| | | | 3 | |
| | | | 5 | |
| | | | 7 | |
| | | | 9 | |
| | | | 11 | |
| | | | 13 | |
| | | | 15 | |
| | | | 17 | |
| | | | 19 | |
p=&a[0]; //p的值是a[0]的地址
p=a; //p的值是数组a首元素(即a[0])的地址
2、在引用数组元素时指针的运算
在指针已指向一个数组元素时,可以对指针进行以下运算: 加一个整数(用+或+=),
p+1
表示指向同一数组中的下一个元素;
减一个整数(用-或-=),
p-1
表示指向同一数组中的上一个元素;
自加运算,
p++,++p
自减运算,
p--,--p
注意:
3、用数组名作函数参数
array是实参数组名,arr为形参数组名。当用数组名作参数时,如果形参数组中各元素的值发生变化,实参数组元素的值随之变化。
以变量名和数组名作为函数参数的比较
| 实参类型 | 变量名 | 数组名 |
| 要求形参的类型 | 变量名 | 数组名或指针变量 |
| 传递的信息 | 变量的值 | |
| 通过函数调用能否改变实参的值 | 不能改变实参变量的值 | 能改变实参数组的值 |
注意:
例1
有一个整型数组a,有10个元素,要求输出数组中的全部元素。
//下标法
#include <stdio.h>
int main()
{ int a[10];
int i;
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
printf("%d ",a[i]);
//数组元素用数组名和下标表示
printf("%\n");
return 0;
}
//通过数组名计算数组元素地址,找出元素的值
#include <stdio.h>
int main()
{ int a[10];
int i;
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
printf("%d ",*(a+i));
//通过数组名和元素序号计算元素地址找到该元素
printf("\n");
return 0;
}
//指针变量指向数组元素
#include <stdio.h>
int main()
{ int a[10];
int *p,i;
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(p=a;p<(a+10);p++)
printf("%d ",*p);
//用指针指向当前的数组元素
printf("\n");
return 0;
}
用下标法比较直观,能直接知道是第几个元素。
单用指针变量的方法进行控制,可使程序简洁、高效。
例2
通过指针变量输出整型数组a的10个元素。
#include <stdio.h>
int main()
{ int i,a[10],*p=a; //p的初值是a,p指向a[0]
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",p++);
p=a; //重新使p指向a[0]
for(i=0;i<10;i++,p++)
printf("%d ",*p);
printf("\n");
return 0;
}
例3
用指针方法对10个整数按由大到小顺序排序。(选择排序法)
#include <stdio.h>
int main()
{ void sort(int x[],int n); //sort函数声明
int i,*p,a[10];
p=a; //指针变量p指向a[0]
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",p++); //输入10个整数
p=a; //指针变量p重新指向a[0]
sort(p,10); //调用sort函数
for(p=a,i=0;i<10;i++)
{ printf("%d ",*p); //输出排序后的10个数组元素
p++;
}
printf("\n");
return 0;
}
void sort(int x[],int n) //定义sort函数,x是形参数组名
{ int i,j,k,t;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k]) k=j;
if(k!=i)
{ t=x[i]; x[i]=x[k]; x[k]=t;}
}
}
///
void sort(int *x,int n) //形参x是指针变量
{ int i,j,k,t;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(*(x+j)>*(x+k)) k=j; //*(x+j)就是x[j],其他亦然
if(k!=i)
{ t=*(x+i); *(x+i)=*(x+k); *(x+k)=t;}
}
}
///
C语言指针操作