六 二级指针三种内存模型
1第一种:指针数组:char *myArray[]={“aaaaaa”, “ccccc”, “bbbbbb”, “111111”};
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void printMyArray11(char **myArray, int num)
{
int i = 0;
for (i=0; i<num; i++)
{
//printf("%s \n", myArray[i]);
printf("%s \n", *(myArray+i) );
}
}
void sortMyArray11(char **myArray, int num)
{
int i =0 , j = 0;
char *tmp = NULL;
//排序
for (i=0; i<num; i++)
{
for (j=i; j<num; j++)
{
if (strcmp(myArray[i], myArray[j]) > 0 )
{
tmp = myArray[i]; //注意 交换的是数组元素 交换的是指针的值 //改变指针的指向
myArray[i] = myArray[j];
myArray[j] = tmp;
}
}
}
}
void main()
{
int i = 0, j = 0;
int num = 0;
char *tmp = NULL;
//数组 数组中的每一个元素是指针 指针数组
char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};
//打印
num = sizeof(myArray)/sizeof(myArray[0]);
printf("排序之前\n");
printMyArray11(myArray, num);
sortMyArray11(myArray, num);
printf("排序之后\n");
printMyArray11(myArray, num);
printf("hello...\n");
system("pause");
return ;
}
2 第二种 :二维数组:char myArray[10][30]={“aaaaaa”, “ccccc”, “bbbbbbb”, “11111”};
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//问题的本质是:dm03_二级指针做输入_第2种内存模型 的 myArray + 1
// dm03_二级指针做输入_第1种内存模型 myArray + 1 不一样 ;
**//指针的步长不一样 指针所指向的内存空间的数据类不一样 。。。。**
void printMyArray02_err(char **myArray, int num)// **myarray不能转换为myarray[10][30]
{
int i = 0;
for (i=0; i<num; i++)
{
//printf("%s \n", myArray[i]);
printf("%s \n", *(myArray+i) ); //
}
}
void printMyArray02(char myArray[10][30], int num)
{
int i = 0;
for (i=0; i<num; i++)
{
//printf("%s \n", myArray[i]);
printf("%s \n", *(myArray+i) ); //
}
}
//交换的是内存块。。。。。。。。
void sortMyArray02(char myArray[10][30], int num)
{
int i, j = 0;
char tmpBuf[30];
for (i=0; i<num; i++)
{
for (j=i+1; j<num; j++)
{
if (strcmp (myArray[i], myArray[j]) > 0)
{
strcpy(tmpBuf, myArray[i]); //交换的是内存块
strcpy(myArray[i], myArray[j]);
strcpy(myArray[j], tmpBuf);
}
}
}
}
//打印 排序
//封装成函数
void main()
{
int i = 0, j = 0;
int num = 4;
char myBuf[30];
char tmpBuf[30];
char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};
//myArray: 编译器只会关心:有10行 ,每行30列。。。。。干什么?myArray+1 多维数组名的本质,
{
int len1 = sizeof(myArray);
int len2 = sizeof(myArray[0]);
int size = len1/len2;
printf("len1:%d , len2:%d size:%d \n", len1, len2, size);
}
//打印
printf("排序之前\n");
printMyArray02(myArray, num);
sortMyArray02(myArray, num);
//打印
printf("排序之后\n");
printMyArray02(myArray, num);
printf("hello...\n");
system("pause");
return ;
}
3 第三种: 手工申请二维内存:char **p2 = NULL;
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char **getMem41(int num)
{
int i = 0;
char **p2 = NULL;
p2 = (char **)malloc(sizeof(char *) * num);
if (p2 == NULL)
{
return NULL;
}
for (i=0; i<num; i++)
{
p2[i] = (char *)malloc(sizeof(char) * 100 ); //char buf[100];
sprintf(p2[i], "%d%d%d", i+1, i+1, i+1);
}
return p2;
}
void printMyArray03(char **myArray, int num)
{
int i = 0;
for (i=0; i<num; i++)
{
printf("%s \n", *(myArray+i) );
}
}
void sortMyArray03(char **myArray, int num)
{
int i =0 , j = 0;
char *tmp = NULL;
//排序
for (i=0; i<num; i++)
{
for (j=i; j<num; j++)
{
if (strcmp(myArray[i], myArray[j]) > 0 )
{
tmp = myArray[i]; //注意 交换的是数组元素 交换的是指针的值 //改变指针的指向
myArray[i] = myArray[j];
myArray[j] = tmp;
}
}
}
}
void getMem41_Free(char **p2, int num)
{
int i = 0;
//释放内存
for(i=0; i<num; i++)
{
if (p2[i] != NULL)
{
free(p2[i]);
p2[i] = NULL;
}
}
if (p2!=NULL)
{
free(p2);
}
}
void main()
{
int i = 0, j = 0;
char **p2 = NULL;
int num = 5;
char *tmp = NULL;
p2 = getMem41(num);
//排序之前
printf("排序之前\n");
printMyArray03(p2, num);
sortMyArray03(p2, num);
printf("排序之后\n");
printMyArray03(p2, num);
getMem41_Free(p2, num); //p2是一个野指针
printf("hello...\n");
system("pause");
return ;
}
七 数组
1 概念:
a)元素类型角度:数组是相同类型的变量的有序集合测试指针变量占有内存空间大.
b)内存角度:联系的一大片内存空间
2 初始化
数组元素的个数可以显示或隐式指定;
数组初始化{0}与memset比较;memset效率较高。
3 技术盲点
a)数组首元素的地址和数组地址是两个不同的概念
b)数组名代表数组首元素的地址,它是个常量
c)数组首元素的地址和数组的地址值相等
4 数组类型
自定义数组类型
typedef int(MYINT5)[5]; //int
typedef float(MYFLOAT10)[10];
MYINT5 Array; 《=》 int array[5];
MYFLOAT10 fArray
5 数组指针类型
数组指针用于指向一个数组
声明一个数组指针类型
typedef int (*MyPointer)[5];
MyPointer myPoint;
{
int b[5];
//声明一个数组指针类型
typedef int (*MyPointer)[5];
//用数组指针类型,去定义一个变量
MyPointer mypoint ;
mypoint= &b;
for (i=0; i<5; i++)
{
(*mypoint)[i] = i;
}
for (i=0; i<5; i++)
{
printf("\n%d %d", b[i], (*mypoint)[i]);
}
}
6 多维数组本质
char cbuf[30]; // cbuf(1级指针)代表数组首元素的地址。。。&cbuf(二级指针)代表整个数组的地址
char array[10][30]; //array是二级指针
(array+i) //相当于整个第i行的数组地址 //二级指针&cbuf
(*(array+i))//一维数组的首地址 cbuf
(*(array+i))+j //相当于第i行第j列的地址了把。。。。&array[i][j]
*((*(array+i))+j) //相当于第i行第j列的地址了把。。。。<====>array[i][j]
八 结构体专题
1结构体变量定义方法
a) 定义类型用类型定义变量
struct _Student
{
char name[32];
char tile[32];
int age;
char addr[128];
};
_Student s1 ,s2;
b) 定义类型的同时,定义变量;
struct _Student
{
char name[32];
char tile[32];
int age;
char addr[128];
}s1, s2; //定义类型的同时,定义变量;
c) 直接定义结构体变量;
struct
{
char name[32];
char tile[32];
int age;
char addr[128];
}s3,s4; //直接定义结构体变量
2 初始化的几种方法
a) struct _Teacher t4 = {“name2”, “tile2”, 2, “addr2”};
b)
struct Dog1
{
char name[32];
char tile[32];
int age;
char addr[128];
}d5 = {"dog", "gongzhu", 1, "ddd"};
c)
struct
{
char name[32];
char tile[32];
int age;
char addr[128];
}d6 = {"dog", "gongzhu", 1, "ddd"};
3 结构体做函数参数
a)
void sortTeacer(Teacher *array, int num)
{
int i,j;
Teacher tmp;
for (i=0; i<num; i++)
{
for (j=i+1; j<num; j++)
{
if (array[i].age > array[j].age)
{
tmp = array[i]; //=号操作 赋值操作
array[i] = array[j];
array[j] = tmp;
}
}
}
}
b)
int createTeacher02(Teacher **pT, int num)
{
int i = 0;
Teacher * tmp = NULL;
tmp = (Teacher *)malloc(sizeof(Teacher) * num); //Teacher Array[3]
if (tmp == NULL)
{
return -1;
}
memset(tmp, 0, sizeof(Teacher) * num);
for (i=0; i<num; i++)
{
tmp[i].alisname = (char *)malloc(60);
}
*pT = tmp; //二级指针 形参 去间接的修改 实参 的值
return 0; //
}