理解指针&排序程序(c语言)

strcpy的原理本身就是内容的复制,虽然参数均为地址.

直接,代码如下:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

bool str_in(char **);
void str_sort(char *[], int);
void swap(void **p1,void **p2);
void str_out(char *[], int);

const size_t BUFFER_LEN = 256;
const size_t NUM_P = 50;

int main(void){

	//初始化
	char *pNum[NUM_P];
	int count = 0;

	//输入
	printf("请依次输入相关名称文段:\n");
	for( ; count < NUM_P; count++){
		if(!str_in(&pNum[count])){
			break;
		}
	}

	//排序
	str_sort(pNum,count);

	//输出
	str_out(pNum,count);

	/*供观察*/
	printf("%p %p %s\n",pNum,*pNum,*pNum);
	printf("%p %p %s\n",pNum,pNum[1],pNum[1]);
	printf("%p %p %s\n",pNum,*(pNum+1),*(pNum+1));
	printf("%p %p %s\n",pNum,*(pNum+2),*(pNum+2));

	
	return 0;
}

bool str_in(char **pString){
	char buffer[BUFFER_LEN];
	
	if(gets(buffer) == NULL){
		exit(1);
	}
	
	if(buffer[0] == '\0'){
		return false;
	}

	*pString = (char*)malloc(strlen(buffer) + 1);

	if(*pString == NULL){
		exit(1);
	}

	strcpy(*pString , buffer);
	printf("%p %p %s\n",pString,*pString,*pString);
	return true;
}

void str_sort(char *p[], int n){
	char *pTemp = NULL;
	bool sorted = false;

	while(!sorted){
		sorted = true;
		for( int i = 0; i < n-1; i++)
		if(strcmp(p[i],p[i+1]) > 0){
			sorted = false;
			swap(&p[i],&p[i+1]);
		}
		
	}
}

void swap(void** p1,void** p2){
	void *pt = *p1;
	*p1 = *p2;
	*p2 = pt;
}

void str_out(char *p[], int n){
	for( int i = 0; i < n; i++){
		printf("%s\n",p[i]);

		/*仅便于观察*/
		//free(p[i]);
		//p[i] = NULL;
	}
	
}


执行结果如下:

lnz@lnz:~/c_test$ ./a.out
请依次输入相关名称文段:
12345
0x7fff25caf920 0x23ce830 12345
125
0x7fff25caf928 0x23ce850 125
235
0x7fff25caf930 0x23ce870 235
17
0x7fff25caf938 0x23ce890 17

12345
125
17
235
0x7fff25caf920 0x23ce830 12345
0x7fff25caf920 0x23ce850 125
0x7fff25caf920 0x23ce850 125
0x7fff25caf920 0x23ce890 17
lnz@lnz:~/c_test$ 

可见,静态分配在栈中,而动态分配在堆中;

并且这里排序交换的参数是指针数组的值,即文段的地址.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值