1. 程式人生 > >二級指標做輸入的三種記憶體模型(學習筆記與記錄)

二級指標做輸入的三種記憶體模型(學習筆記與記錄)

一:二級指標做輸入的第一種記憶體模型

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//void print_array(char *p[],int n)
void print_array(char **p, int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%s\n", p[i]);
		printf("\n");
	}
}
//void sort_array(char *p[],int n)
void sort_array(char **p, int n)
{
	int i, j;
	char *tmp = NULL;
	for (i = 0; i < n - 1; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (strcmp(p[i], p[j]) > 0)
			{
				tmp = p[i];
				p[i] = p[j];
				p[j] = tmp;
			}
		}
	}

}

int main(void)
{
	//指標陣列,指標的陣列,它是一個數組,每一個元素都是指標char * 
	char *p[] = { "3333333333333","11111111111","bbbbbbbbbbbbb","aaaaaaaaaa" };
	int n = sizeof(p) / sizeof(p[0]);
	
	printf("排序前:\n");
	print_array(p,n);
	
	sort_array(p, n);//排序

	printf("排序後:\n");
	print_array(p, n);

	system("pause");//暫停
	return 0;

	
}

二:二級指標做輸入的第二種記憶體模型

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void print_array(char a[][30], int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%s\n", a[i]);
	}
}
void sort_array(char a[][30], int n)
{
	int i = 0;
	int j = 0;
	char tmp[30];
	for (i = 0; i < n - 1; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (strcmp(a[i], a[j]) > 0)
			{
				///交換整個記憶體塊
				strcpy(tmp, a[i]);
				strcpy(a[i], a[j]);
				strcpy(a[j], tmp);
			}
		}
	}
}
int main(void)
{
	//4個a[30]的一維陣列,二維陣列
	char a[][30] = { "22222222222", "11111111111", "bbbbbbbbbbb", "aaaaaaaaaaaa" };
	int n = sizeof(a) / sizeof(a[0]);

	printf("排序前:\n");
	print_array(a, n);

	sort_array(a, n);//排序

	printf("排序後:\n");
	print_array(a, n);

	system("pause");
	return 0;
}

三:二級指標做輸入的第三種記憶體模型

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **getMem(int n)
{
	int i = 0;
	//動態分配一個數組,每個元素都是char *
	char **buf = (char**)malloc(n*(sizeof(char*)));//char *buf[3]
	if (buf == NULL)
	{
		return -1;
	}
	for (i = 0; i < n; i++)
	{
		buf[i] = (char*)malloc(30 * sizeof(char));
		char str[30];
		sprintf(str, "test%d%d", i, i);
		strcpy(buf[i], str);
	}
	return buf;
}
void print_buf(char **buf, int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%s ", buf[i]);
	}
}
void free_buf(char **buf, int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		free(buf[i]);
		buf[i] = NULL;
	}
	if (buf != NULL)
	{
		free(buf);
		buf = NULL;
	}
}
int main(void)
{
	char **buf = NULL;
	int n = 3;
	buf = getMem(n);
	if (buf == NULL)
	{
		printf("getMem err\n");
		return -1;
	}
	print_buf(buf, n);

	free_buf(buf, n);
	buf = NULL;
	system("pause");
	return 0;
}   //記憶體結構圖如下