第五次实验 数组和指针
任务1
#include <stdio.h> const int N=3; int main() { int a[]={1,2,3}; int i; printf("通过数组名以及下标直接访问数组元素:\n"); for (i=0;i<N;i++) printf("%d: %D\n",&a[i],a[i]); printf("通过地址间接访问数组元素:\n"); for(i=0;i<N;i++) printf("%d: %d\n",a+i,*(a+i)); return 0; }
1.数组元素在内存中是连续存放的
2.a+i 和&[i],以及*(a+i)和a[i]是等价的
任务2
#include <stdio.h> const int LINE=2; const int COL=3; int main(){ int a[LINE][COL] = {1,2,3,4,5,6}; int i,j; printf("通过数组名以及下标直接访问数组元素:\n"); for(i=0;i<LINE;i++) for(j=0;j<COL;j++) printf("%d: %d\n",&a[i][j],a[i][j]); printf("通过地址间接访问数组元素:\n"); for(i=0;i<LINE;i++) for(j=0;j<COL;j++) printf("%d: &d\n",a[i]+j,*(a[i]+j)); printf("二维地址中a+i表示的地址:\n"); for(i=0;i<LINE;i++) printf("a+%d: %d\n",i,a+i); return 0; }
1.C语言中,二维数组的存储方式是行式存储
2.所列出的方式等价
任务3
// 使用指针变量间接访问一维数组 #include <stdio.h> #include <stdlib.h> const int N=3; int main() { int a[N]; int *p,i; // 通过指针变量p,完成数组元素输入 for(p=a; p<a+N; p++) scanf("%d", p); // 过指针变量p,完成数组元素输出 for(p=a; p<a+N; p++) printf("%d ", *p); printf("\n"); p = a; //通过指针变量p,完成数组元素输入 for(i=0; i<N; i++) scanf("%d", p+i); // 通过指针变量p,完成数组元素输出 for(i=0; i<N; i++) printf("%d ", *(p+i)); printf("\n"); return 0; }
1.由line12可知,指针p指向数组a中元素的地址
2.line12--line13执行完后,p指向a数组a的地址;line16--line17结束后,p指向数组a整体
3.line22--23结束,p指向数组a中的第三个元素地址 line26--27结束,p指向第三个元素
任务4
//使用指针变量间接访问二维数组
#include <stdio.h>
int main(){
int a[2][3]={1,2,3,4,5,6};
int i,j;
int *p;//p是指针变量,存放int类型数据的地址
int(*q)[3] ;//q是指针变量,存放包含有三个元素的一维数组的地址
//通过指针变量q间接访问,输出二维数组a的元素值
for(p=a[0];p<a[0]+6;p++)
printf("%d",*p);
printf("\n");
//通过行指针变量q间接访问,输出二维数组a的元素值
for (q=a;q<a+2;q++)
for (j=0;j<3;j++)
printf("%d",*(*q+j));
printf("\n");
return 0;
}
将line11更换后:
我认为产生报错是因为定义的指针p,是返回值为int,但是没有参数的指针,但是p指向的a,是返回值为int,有参数的指针。应该是因为两者不匹配的问题。
尬尴了尴尬了,前方猜测错误!!出现错误是因为没有加地址符!更改之后两者的结果是一样的,也就是可以替换?那么为什么可以。。。。。重新来。(这是输入更换的line11后)
2.*q+j是指数组a中的元素地址,而*(*q+j)则是指通过访问这个地址间接访问该元素的数值
可以正确表示a[1][2] de有
A B C D E F G
实验任务5
//练习,使用二分查找,在一组有序元素中查找数据项 //形参是数组,实参是数组名 #include<string.h> #include <stdio.h> const int N=5; int binarySearch(int x[],int n, int item);//函数声明 int main() { int a[N]={2,7,19,45,66}; int i,index,key; printf("数组a中的数据:\n"); for (i=0;i<N;i++) printf("%d",a[i]); printf("\n"); printf("输入待查找的数据项:"); scanf("%d",&key) ; //调用函数binarySearch()在数组a中查找指定数据项key,并且返回查找结果给index //补足代码一 //XXX int n,item,idenx; int x[n]; index=binarySearch(x,n,key); if (idenx>=0) printf("%d在数组中,下标为%d\n",key,index); else printf("%d不在数组中\n",key); return 0; } //使用二分法在数组x中查找特定值item,数组x大小为n,如果找到。返回其下标,如果没有找到,返回-1 int binarySearch(int x[],int n,int item) { int low,high,mid; low=0; high=n-1; while(low<=high){ mid=low+(high-low)/2; if(item==x[mid]) return mid; else if(item<x[mid]) high=mid-1; else low=mid +1; } return -1; }
任务5--2
// 练习:使用二分查找,在一组有序元素中查找数据项 // 形参是指针变量,实参是数组名 #include <stdio.h> const int N=5; int binarySearch(int *x, int n, int item); // 函数声明 int main() { int a[N]={2,7,19,45,66}; int i,index, key; printf("数组a中的数据:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); printf("输入待查找的数据项: "); scanf("%d", &key); // 调用函数binarySearch()在数组a中查找指定数据项key,并返回查找结果给index // 补足代码① // ××× index=binarySearch(a,N,key) ; if(index>=0) printf("%d在数组中,下标为%d\n", key, index); else printf("%d不在数组中\n", key); return 0; } //函数功能描述: //使用二分查找算法在从x中查找特定值item,数组x大小为n // 如果找到,返回其下标 // 如果没找到,返回-1 int binarySearch(int *x, int n, int item) { int low, high, mid; low = 0; high = n-1; while(low <= high) { mid = (low+high)/2; if ( item == *(x+mid) ) return mid; else if(item < *(x+mid)) high=mid-1; else low=mid+1; } return -1; }
任务6
6.1运行结果截图
任务6.2
// 练习:使用选择法对字符串按字典序排序 #include <stdio.h> #include<string.h> const int N = 5; void selectSort(char str[][20], int n ); // 函数声明,形参str是二维数组名 int main() { char name[][20] = {"Bob", "Bill", "Joseph", "Taylor", "George"}; int i; printf("输出初始名单:\n"); for(i=0; i<N; i++) printf("%s\n", name[i]); selectSort(name, N); // 调用选择法对name数组中的字符串排序 printf("按字典序输出名单:\n"); for(i=0; i<N; i++) printf("%s\n", name[i]); return 0; } // 函数定义 // 函数功能描述:使用选择法对二维数组str中的n个字符串按字典序排序 void selectSort(char str[][20], int n) { int i,j,k; char temp[20]; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(strcmp(str[j],str[k])<0) k=j; if(k!= i) { strcpy(temp,str[i]); strcpy(str[i],str[k]); strcpy(str[k],temp); } } }
实验总结:天哪,指针的表示方法好晕,感觉失之毫厘,谬之千里。果然细节非常重要
对选择排序法还有二分查找的概念还不够理解,也不够熟练
对指针的运用也要多练习,多理解。加油吧。。。。。