关于指针的经典疑惑
程序员文章站
2022-04-22 18:02:37
...
1:从键盘接收n个字符串:
char arr[MAXSIZE][MAXSIZE];
char *stu[MAXSIZE];
int n;//字符串个数
int i;
printf("请输入待比较字符串个数:");
scanf("%d",&n);
printf("\n请输入待比较字符串:");
for(i=0;i<n;i++)
{
scanf("%s",arr[i]);//等价于&arr[i][0];
stu[i]=arr[i];//为啥不能直接scanf("%s",stu[i])
}
为啥不能直接scanf("%s",stu[i]) ; 可以理解为:char *p; scanf("%s",p); 这种方法错误在p没有指向;
正确的方法为:char str[10]; char *p=str ; scanf("%s",p); 这种用法才正确。定义指针时,要尽快将其指向确定的指向;
2:从键盘接收n个数字:
int *stu[MAXSIZE];
int n;
int i;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&stu[i]);//这个地方就可以直接存放
这里也可以使用动态数组 char*p=(char*) malloc ( n*sizeof(char) );3: 指针数组对应关系:
从键盘接收n个字符串,进行排序后输出,两种方法比较:
//方法一将接收来的字符串放在二维数组p中;通过传递二维数组名方法实现实参的传递。
实参与形参的对应关系:char arr[ ][ ]----->char p[ ][ ],亦可以使用char arr[ ][ ]--->char (*p)[ ];
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
void main()
{
void sort(char p[MAXSIZE][MAXSIZE],int n );//void sort(char (*p)[MAXSIZE],int);
char arr[MAXSIZE][MAXSIZE];
int n;//字符串个数
int i;
printf("请输入待比较字符串个数:");
scanf("%d",&n);
printf("\n请输入待比较字符串:");
for(i=0;i<n;i++)
scanf("%s",arr[i]);//等价于&arr[i][0];
printf("\n排序后的元素为:\n");
sort(arr,n);
for(i=0;i<n;i++)
printf("%s\n",arr[i]);
printf("\n");
}
void sort(char p[MAXSIZE][MAXSIZE],int n )//void sort(char (*p)[MAXSIZE],int n )
{
char temp[MAXSIZE];
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if (strcmp(p[k],p[j])>0) k=j;
if (k!=i)
{
strcpy(temp,p[i]);
strcpy(p[i],p[k]);
strcpy(p[k],temp);
}
}
}
//方法二:新定义一个一维指针数组存放接收来的字符串的首地址,通过传递存放字符串首地址的一维指针数组实现指针指向改变,进而实现排序输出:
实参与形参对应关系:*stu[n]----->**p ,当传递二维数组名arr时候,不行即arr[ ][ ]----->**p有问题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
void main()
{
void sort(char **p,int n );
char arr[MAXSIZE][MAXSIZE];
char *stu[MAXSIZE];
int n;//字符串个数
int i;
printf("请输入待比较字符串个数:");
scanf("%d",&n);
printf("\n请输入待比较字符串:");
for(i=0;i<n;i++)
{
scanf("%s",arr[i]);//等价于&arr[i][0];
stu[i]=arr[i];//一维指针数组存放接收来的字符串的首地址
}
printf("\n排序后的元素为:\n");
sort(stu,n);
for(i=0;i<n;i++)
printf("%s\n",stu[i]);//证明了只是stu指针数组指向发生改变,而二维数组arr的没有发生改变
//printf("%s\n",arr[i]);
printf("\n");
}
void sort(char **p,int n )
{
char *temp;
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if (strcmp(*(p+k),*(p+j))>0) k=j;
if (k!=i)
{
temp=*(p+i);
*(p+i)=*(p+k);
*(p+k)=temp;
}
}
}