第十一天
1.一维数组指针 注意:
(1)数组名不代表整个数组,只代表数组的首元素的地址(是一个常量,若数组名++,是不对的)。
(2) “P=a”,的作用是“把a 数组的首元素地址付给指针变量 P”,而不是把数组a各个元素的值付给P。
2. 一维指针数组:一个数组元素值为指针则为指针数组,
格式为:类型说明符 *数组名[数组长度];
应用:数组的逆序:
#include <stdio.h>
void nixu(int *p,int len){
int *x,*i,*j,m=(len-1)/2,temp;
i=p;j=p+len-1;x=p+m;
for (;i<x; i++,j--) {
temp=*i;
*i=*j;
*j=temp;
}
}
int main(int argc, const char * argv[]) {
int i=0,a[10];
printf("请输入十个数字:以空格隔开\n");
for (int i=0; i<10; i++) {
scanf("%d",&a[i]);
}
for (int i=0; i<10; i++) {
printf("您输入的十个数字是:%d\n",a[i]);
}
nixu(a,10);
for (int i=0; i<10; i++) {
printf("%d\t",a[i]);
}
return 0;
}
指针变量之间可以做减法运算,主要为了判断两个指针变量是否连续,或者判断两个指针变量之间相隔几个元素: 具体计算公式为:(地址1-地址2)/sizeof (所指向的数组)。
关系运算: 如果p1>p 运算结果为1,表示p1在高位,为0,表示p在高位。
3. 二维数组指针: 数组指针变量说明:
一般形式为:数据类型(*指针变量名)[二维数组列表];
二维数组的行指针和列指针:
4.字符串指针 格式为:char *变量名=”字符串内容”,(字符串内容是常量),作用是保存一个字符串。 *str=“abc” str 只是保存了字符串常量的首地址,是一个指针变量。字符串保存在常量区,在常量区保存的数据都只是可读的,不可以改变。
5.二维字符串数组的概念:
一维字符数组 char ch[10]={‘a’,’b’};或者 char ch[]=“abc’;
二维字符数组 char ch[3][10]={{‘a’,’b’},{‘b’},{‘c’}}; 或者 char ch3[3][10]={“abc”,”def”,”erf”};
字符串类型的指针数组 格式 char *name[3]={“abc”,”def”};
应用例题:字符串排序:
#include <stdio.h>
#include <strings.h>
void sort(char *name[],int n){
char * temp;
for (int i=0; i<n-1; i++) {
for (int j=1; j<n; j++) {
if (strcmp(name[i], name[j])<0) {
temp=name[i];
name[i]=name[j];
name[j]=temp;
}
}
}
}
int main(int argc, const char * argv[]) {
char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Compter Design"};
int n=5;
sort(name, n);
for (int i=0; i<5; i++) {
printf("%s\n",name[i]);
}
return 0;
}
6. 有关二维数组a的有关指针:
7.分析如下代码:
#include<stdio.h>
int main() {
// 定义一个指针变量
int a=5;
int *p =&a;
printf("p =%p\n",p);
printf("&a=%p\n",&a);
// 定义一个二级指针
int **p1 =&p;
int *p2=p;
printf("&p=%p\n",&p);
printf("p=%p\n",p1);
printf("%p",p2);
}
|
|