Day04--代码

1.数组本质基础

#define _CRT_SECURE_NO_WARNINGS

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

//定义
typedef struct 	_Teacher
{
	char name[20];
	int age;

}Teacher;

int  main01()
{
	int i = 0;

	typedef int MyArrayType[5];  	   //define Array
	MyArrayType  myArray;              // ----》int myArray[5]

	for (i = 0; i < 5; i++)				   //set Array
	{
		myArray[i] = i + 1;
	}

	for (i = 0; i < 5; i++)					//printf Array
	{
		printf("%d  \n",myArray[i]);
	}

	system("pause");

	return 0;
}
 //演示如何通过数组类型  来定义一个指向数组类型的指针变量
int main02()
{
	int i = 0;
	//定义一个数组类型
	typedef int MyArrayType[5];

	//定义了一个 数组类型的指针
	MyArrayType *pArray = NULL;

	int a[5];

	//如何定义一个数组类型指针
	{
		int a1;
		int *p1 = NULL;

		p1 = &a1; //对变量取地址,赋给指针
	}
	pArray = &a;

	//通过数组指针的方式来操作a【5】这块内存

	for (i = 0; i < 5; i++)
	{
		(*pArray)[i] = i + 1;//a[5] = i+1;
	}

	for (i = 0; i < 5; i++)
	{
		printf("%d \n ",*(*pArray+i));
	}

	system("pause");
	return 0;
}

//定义数组指针类型
void main03()
{
	int i = 0;
	//这个是定义了一个类型,这个类型是数组类型
	typedef int MyArrayType[5]; //int 

	//这个是定义了一个类型,定义了一个指针类型,定义了一个指向数组的指针类型。。。。//数组指针
	typedef int(*MyPArrType)[5];

	MyPArrType myPoint; //int b[5]; 

	int b[5];
	{
		int b1 = 0;
		int *pb1 = &b1;  //变量取地址给指针赋值
	}
	myPoint = &b; //变量取地址给指针赋值 

	for (i = 0; i<5; i++)
	{
		(*myPoint)[i] = i + 1;
	}

	for (i = 0; i<5; i++)
	{
		printf("%d  ", (*myPoint)[i]);
	}

	system("pause");
}

void main04()
{
	int i = 0;
	int c[5];
	int(*myArrayPoint)[5]; //告诉编译给我开辟四个字节内存
	{

		//定义一个数组类型
		typedef int MyArrayType[5]; //int 
		//定义了一个 数组类型的指针
		MyArrayType *pArray = NULL; //59
	}

	{
		//这个是定义了一个类型,定义了一个指针类型,定义了一个指向数组的指针类型。。。。//数组指针
		typedef int(*MyPArrType)[5];
		MyPArrType myPoint; //int b[5]; //96
	}

	myArrayPoint = &c;
	for (i = 0; i<5; i++)
	{
		(*myArrayPoint)[i] = i + 1;
	}

	for (i = 0; i<5; i++)
	{
		printf("%d  ", (*myArrayPoint)[i]);
	}

	system("pause");

}

2.多维数组本质

#define _CRT_SECURE_NO_WARNINGS

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

  // 证明二维数组的存储,是线性的....

void   printArray(char aa[][5]);
void   printArray02(int *p);


void main()

{
	int a[3][5];



	int c[5];//&c +1

	int b[10]; //b代表数组首元素的地址 &b代表这个数组的地址 &b+1相当于 指针后移4*10个单位
	//指针步长===》铁律1


	//a代表什么什么呢?a是一个数组指针 指向低维数组的指针
	//a +1;
	printf("a:%d,a+1:%d\n",a,a+1);

	{
		int i = 0, j = 0, tmp = 0;
		for (i = 0; i<3; i++)
		{
			for (j = 0; j<5; j++)
			{
				a[i][j] = ++tmp;
			}
		}

		printf("\n");
		for (i = 0; i<3; i++)
		{
			for (j = 0; j<5; j++)
			{
				printf("%d \n", a[i][j]);
			}
		}
	}
	//a的本质是一个数组指针。。。。每次往后跳一维的维数。。。。。。


	{
		int i = 0, j = 0;
		//定义了一个数组指针 变量
		int(*myArrayPoint)[5]; //告诉编译给我开辟四个字节内存
		myArrayPoint = a;
		printf("\n");
		for (i = 0; i<3; i++)
		{
			for (j = 0; j<5; j++)
			{
				//myArrayPoint[i][j] = ++tmp;
				printf("%d \n", myArrayPoint[i][j]);
			}
		}
	}
	/*
	char array[10][30];
	(array+i) //相当于 第i行的首地址 //二级指针

	(*(array+i))//一维数组的首地址

	(*(array+i))+j //相当于第i行第j列的地址了把。。。。

	*((*(array+i))+j) //相当于第i行第j列的地址了把。。。。<====>array[i][j]
	*/


	system("pause");
}

3.多维数组做函数参数退化技术推演

#define _CRT_SECURE_NO_WARNINGS

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

//int a[10] ===int a[]    =====>int *a
//char buf[10][30] ===>
int printfArray(char buf[10][30]);
int printfArray(char buf[][30]); 
int printfArray(char (*buf)[30]); 
//int spitString02( char *buf1, char c, char buf[10][30], int *num)
//int spitString02( char *buf1, char c, char buf[][30], int *num)
int spitString02(char *buf1, char c, char(*buf)[30], int *num)
{
	int ret = 0;
	char *p = NULL;
	char *pTmp = NULL;
	int ncount = 0;
	if (buf1 == NULL || num == NULL)
	{
		return -1;
	}
	//步骤1 初始化条件 pTmp,p都执行检索的开头
	p = buf1;
	pTmp = buf1;
	do
	{
		//步骤2 strstr strchr,会让p后移 	在p和pTmp之间有一个差值
		p = strchr(p, c);
		if (p == NULL) //没有找到则跳出来
		{
			break;
		}
		else
		{

			//挖字符串
			strncpy(buf[ncount], pTmp, p - pTmp);
			buf[ncount][p - pTmp] = '\0';

			ncount++;

			//步骤3 让p和pTmp重新初始化,达到检索的条件
			pTmp = p = p + 1;
		}

	} while (*p != '\0');
	//printf("ncout:%d\n", ncount);
	*num = ncount;
	return ret;
}

void main()
{
	int ret = 0, i = 0;
	char *buf1 = "abcdef,acccd,";
	char c = ',';
	char buf[10][30];
	int num = 0;
	ret = spitString02(buf1, c, buf, &num);
	if (ret != 0)
	{
		printf("func spitString() err:%d\n", ret);
		return;
	}

	for (i = 0; i<num; i++)
	{
		printf("%s\n", buf[i]);
	}

	system("pause");
}

4.证明多维数组的线性存储(线性打印)

#define _CRT_SECURE_NO_WARNINGS

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

//多维数组做函数参数,一般情况下,只能表达到二维,
//一般情况:1级指针代表1维,二级指针代表二维。多维只是程序员自己起的名字
/*
void printfAARRR(char ***ddd);
void printfAARRR(char *********dddd);
*/
void printfArray411(int *array, int num)
{
	int i = 0;
	for (i = 0; i<num; i++)
	{
		printf("%d ", array[i]);
	}
}

void printfArray412(int(*array)[5], int num)
{
	return;
}

void printfArrr333(int c[3][4][5])
{
	return;
}
void main()
{
	int a[3][5];
	int c[3][4][5];
	int i, j = 0;
	int tmp = 0;
	for (i = 0; i<3; i++)
	{
		for (j = 0; j<5; j++)
		{
			a[i][j] = tmp++;
		}
	}


	printfArray411((int *)a, 15);

	system("pause");
}

5.内存分配示意图

6.指针数组

#define _CRT_SECURE_NO_WARNINGS

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

 //演示:指针数组的用法
//演示: 找错误  注意return

//求关键字在表中的位置
//一个入口 多个出口

int searcheKeyTable(const char *table[],const int size , const char* key,int *pos)
{
	int rv = 0;
	int i = 0;
	int inum = 0;
	if (table == NULL || key == NULL || pos == NULL)
	{
		rv = -1;
		printf("func searcheKeyTable:%d", rv);
		return rv;
	}
	inum = (sizeof(table) / sizeof(*table));

	for (i = 0; i<size; i++)
	{
		if (strcmp(key, table[i]) == 0)
		{
			*pos = i;
			//break;
			return rv;
		}
	}

	//没有找到返回-1
	if (i == size)
	{
		*pos = -1;
	}
	return rv;
}

#define DIM(a)  (sizeof(a)/sizeof(*a))

int main01()
{
	int inum = 0;
	int pos = 0;
	int a[10];
	int i = 0;

	//指针数组
	char *  c_keyword[] = {
		"while",
		"case" ,
		"static",
		"do"
	};

	searcheKeyTable(c_keyword, DIM(c_keyword), "do", &pos);
	//searcheKeyTable( c_keyword, inum,"do", &pos);
	printf("pos:%d\n", pos);
	//searcheKeyTable(NULL, DIM(c_keyword),"do", &pos);
	//printf("pos:%d\n", pos);
	searcheKeyTable(c_keyword, DIM(c_keyword), "static", &pos);
	printf("pos:%d\n", pos);
	system("pause");
	return 0;
}
//main函数是操作系统调用的函数
//在程序执行的时候可以向main函数传递参数

/*
argc 命令行参数
argv 命令行参数数组
env  函数变量数组

int main();
int main(int argc);
int main(int argc, char *argv[])
*/
int main(int argc, char* argv[], char**env)
{
	int i = 0;
	//main02_1();

	printf("******************* Begin argv *******************\n");
	for (i = 0; i<argc; i++)
	{
		printf("%s\n", argv[i]);
	}

	// 	for(i=0; argv[i]!=NULL; i++)
	// 	{
	// 		printf("%s\n", argv[i]);
	// 	}
	printf("******************* End argv *******************\n");

	printf("\n");
	printf("\n");
	printf("\n");

	printf("******************* Begin env *******************\n");

	for (i = 0; env[i] != NULL; i++)
	{
		printf("%s\n", env[i]);
	}

	printf("******************* End env*******************\n");

	getchar();
}

猜你喜欢

转载自blog.csdn.net/qq_41543888/article/details/86602214