第八章 善于利于指针
指针是什么
指针变量
通过指针引用数组
通过指针引用字符串
10个存储单元
int a[10] ;int *p;p=a; p->a[0] p=&a[0] p++-->a[1] p-- -->a[n-1] p2-p1 间隔着几个数组元素 p1+p2无意义
p=a p+i
*(p+i)=a[i]
p+i=&a[i]
引用数组元素的计算 以上
引用数组元素 下标法a[i]
指针法 *(a+i)或 *(p+i)
有一个整型数组a,有10个元素,要求输出数组中的全部元素。(通过指针引用)
三种方法 下标法 通过数组名计算 指针变量指向数组元素1.2.3.
#include<stdio.h>
#include<conio.h> //getch
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,0}; //a[10]
int *p=a,i; //*p=a
for(i=0;i<10;i++) //循环输出 *p不断加i
{
printf("%d",*(p+i));
}
getch();
return 0;
}
下标法 for scanf &a[i]for printf a[i] 双for循环输入输出
通过数组名 双for循环 *p=a *p
指针变量 指向数组元素
int *p=a,i
for (i=0;i<10;i++)
printf(%d,*(p+i))
p++;
*p
指针引用数组元素
下标法 a[i]
地址法 *(a+i)
用数组名做函数参数
主调函数 实参用数组名
被调用函数 形参用指针变量
实参 数组名
和形参 数组名或 指针变量
看程序
#include<stdio.h>
#include<conio.h> //getch
int main()
{
int *p,i,a[10];
p=a;
printf("sss");
for(i=0;i<10;i++)scanf("%d",p++);
for(i=0;i<10;i++)
printf("%d",*p);
printf("\n");
return 0;
}
将数组a中n个整数按相反顺序存放
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
void inv(int* x, int n);
int i;
int a[10];
int* p = a;
printf("请输入10个数字:");
for (i = 0; i < 10; i++, p++)
{
scanf("%d", p);
}
p = a;//指针p重新指向数组首地址
inv(p, 10);
for (p = a; p < a + 10; p++)
{
printf("%d ", *p);
}
printf("\n");
system("pause");
return 0;
}
void inv(int* x, int n)
{
int temp;
int* i, * j;//定义指向首、尾指针
i = x;
j = x + n - 1;
for (; i < j; i++, j--)
{
temp = *i; *i = *j; *j = temp;//交换指针所指向的变量的值
}
}
#include <stdio.h>
void exchange(int *s, int n); //定义反序函数
int main()
{
int a[5], *p;
for (p=a; p<a+5; scanf("%d", p++)); //通过指针法输入整数
exchange(a, 5); //调用反序函数
for (p=a; p<a+5; printf("%d ", *p++)); //输出反序后的整数
printf("\n");
return 0;
}
//反序函数
void exchange(int *s, int n)
{
int *i, *j, t;
for (i=s, j=s+n-1; i<=s+(n-1)/2; t=*i, *i++=*j, *j--=t);
}
指针法
int t ,i j ,m=n-1/2
i=0;j=n-1
for(;i<=m;i++)
t=b[i];b[i]=b[j]