欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于指针的经典疑惑

程序员文章站 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;
		}	
	}
}