观点:二级指针做输入的三种内存模型是以编译器分配内存地点的不同分类的。
第一种内存模型://编译器分配在常量区上的内存。
Char *myarray[]={"fdskajlfjie","fsdlajfie","fkdsaljfie","fdksajfi"};
定义一个指针数组,数组中每个元素是指针,指向一串字符串(该字符串分配在字符串常量区)。
排序时,交换的是指针的指向,并没有使用*p
.
#include"stdio.h"
void display(char **p, int num) {
int i = 0;
for (i = 0; i < num; i++)
printf("%s ", p[i]);
}
void display(char **p, int num) {
int i = 0;
for (i = 0; i < num; i++)
printf("%s ", p[i]);
}
void sort(char **buf, int num) {
int i = 0, j = 0;
char *temp = NULL;
for (i = 0; i < num; i++)
for (j = i; j < num; j++)
if (strcmp(buf[i], buf[j]) > 0)
{
temp = buf[i];
buf[i] = buf[j];
buf[j] = temp;
}
}
int i = 0, j = 0;
char *temp = NULL;
for (i = 0; i < num; i++)
for (j = i; j < num; j++)
if (strcmp(buf[i], buf[j]) > 0)
{
temp = buf[i];
buf[i] = buf[j];
buf[j] = temp;
}
}
void main()
{
char *buf[] = { "aaaaa","bbbbb","ffffff","ddddd","ccccc","22222" };
int i = 0, j = 0;
int num = 0;
char *temp = NULL;
num = sizeof(buf) / sizeof(buf[0]);
{
char *buf[] = { "aaaaa","bbbbb","ffffff","ddddd","ccccc","22222" };
int i = 0, j = 0;
int num = 0;
char *temp = NULL;
num = sizeof(buf) / sizeof(buf[0]);
display(&buf, num);
sort(&buf, num);
printf("\n");
display(&buf, num);
system("pause");
}
第二种内存模型://编译器在栈上分配的内存。
排序时交换的是内存块,不是指针。
数据存放在数组中,编译器分配内存在临时区(栈区)
使用数组进行存储。
//strcmp的用法:比较两个字符串的大小。strcmp(str1,str2)>0;:表示的是如果str1的字符比str2大的话返回比一大的值。否则反之。
第二种模型的输入参数方式为数组形式,并不能用二级指针模式,具体原因我也在学习。
第二种模型的输入参数方式为数组形式,并不能用二级指针模式,具体原因我也在学习。
#include"stdio.h"
void sort(char p[][30], int length) {
int i, j;
char tem[10];
for (i = 0; i < length; i++)
for (j = i; j < length; j++)
if (strcmp(p[i], p[j]) > 0)
{
strcpy(tem, p[i]); //对数据进行排序
strcpy(p[i], p[j]);
strcpy(p[j], tem);
}
}
void display(char buf[][30],int length) {
int i;
for (i = 0; i < length; i++)
printf("%s ", buf[i]); //打印数据
printf("\n");
}
void main()
{
char buf[10][30] = { "11111","aaaaaa","cccccc","dddddd","bbbbbbb" };
int i = 0, j = 0;
int num = sizeof(buf) / sizeof(buf[0]);
void sort(char p[][30], int length) {
int i, j;
char tem[10];
for (i = 0; i < length; i++)
for (j = i; j < length; j++)
if (strcmp(p[i], p[j]) > 0)
{
strcpy(tem, p[i]); //对数据进行排序
strcpy(p[i], p[j]);
strcpy(p[j], tem);
}
}
void display(char buf[][30],int length) {
int i;
for (i = 0; i < length; i++)
printf("%s ", buf[i]); //打印数据
printf("\n");
}
void main()
{
char buf[10][30] = { "11111","aaaaaa","cccccc","dddddd","bbbbbbb" };
int i = 0, j = 0;
int num = sizeof(buf) / sizeof(buf[0]);
printf("%d", num);
display(buf, num);
sort(buf, num);
display(buf, num);
system("pause");
}
第三种模型:程序员自己在堆上分配的内存。
自己打造的内存空间,首先定义一个二级指针变量,再用malloc函数分配一组存放一级指针的内存把地址赋给二级指针,再用malloc函数分配内存存放内容。
Sprintf(内存首地址,”数据类型“,数据):将数据打印到内存中.
Eg :sprintf(p,"%d",343); 将数据343以%d的形式输入到p所指向的内存空间。
可以用指针交换排序,也可以交换指针所执行的内存空间。
void init3(char ***p, int num) //初始化方法一
{
char ** first = NULL;
int i;
first = (char **)malloc(sizeof(char*)*num); //分配内存存放一级指针
for (i = 0; i < num; i++)
{
first[i] = (char*)malloc(sizeof(char) * 100); //为一级指针分配空间存放数据
sprintf(first[i], "%c%c%c", 'a' + i, 'a' + i, 'a' + i);
}
*p = first;
}
{
char ** first = NULL;
int i;
first = (char **)malloc(sizeof(char*)*num); //分配内存存放一级指针
for (i = 0; i < num; i++)
{
first[i] = (char*)malloc(sizeof(char) * 100); //为一级指针分配空间存放数据
sprintf(first[i], "%c%c%c", 'a' + i, 'a' + i, 'a' + i);
}
*p = first;
}
/*
void display3(char **p, int num) {
int i, j;
for (i = 0; i < num; i++) //打印
{
printf("%s\n", p[i]);
}
}
void sort3(char **p, int num)
{
int i, j;
char *tem = NULL;
for (i = 0; i < num; i++)
for (j = i + 1; j<num; j++) //排序
{
if (strcmp(p[i], p[j]) < 0)
{
tem = p[i];
p[i] = p[j];
p[j] = tem;
}
}
}
void main3() {
char **first = NULL;
int num = 5;
// first = init(num);
initerr(&first, num);
display3(first, num);
sort3(first, num);
display3(first, num);
system("pause");
}