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();
}