C语言提高(二)

六 二级指针三种内存模型
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; //
}

猜你喜欢

转载自blog.csdn.net/weixin_40878579/article/details/81270464
今日推荐