int A[5] = {0};
int B[3][5] ={0};
C语言规定[一维数组]:
数组名(A)是数组首元素的地址
根据数组名取地址(&A),取出的则是整个数组的地址
C语言规定[二维/多维数组]:
int * pArr[5] -> B[x][5];
数组名(B)是指向数组第0行的所有元素地址
B+1 -> 是指向数组第一行的所有元素的地址
*(B+1) -> 是指向第一行第一列的元素的地址
*(B+1)+i <==> &B[i][j]
B[3][5] <==> *(*(B+3)+5);
二维数组作为参数传递:function(int (*a)[5]);
typedef int (MyArray)[5];
定义一个数组:MyArray arr ;==> int arr[5];
定义一个指针数组:MyArray * pArr;==>int * pArr[5];
typedef int (*pArray)[5];
定义一个指针数组:pArray pArr;==> int * pArr[5];
char * str[] = {"abc","abc","abc","\0"};
void show(char ** str){
int i = 0;
for (;str[i] != NULL;i++)
printf("%s\n",str[i]);
}
struct Teacher{
char name[64];
int age;
};
....
struct Teacher one = {"aaa",16};
struct Teacher two;
memset(&two,0,two);
two = one;
void copyTeacher(struct Teacher to ,struct Teacher from ){to = from;}
copyTeacher(two,one);
void copyTeacher(struct Teacher * to , struct Teacher * from){*to = *from;}
copyTeacher(&two,&one);
* 结构体与一级指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct Teacher{
char * Name;
int age;
}Teacher;
Teacher * createTeacher_01(int num);
int createTeacher_02(Teacher ** teacher ,int num);
void FreeTeacher(Teacher * teacher, int num);
int main()
{
return 0;
}
Teacher * createTeacher_01(int num){
Teacher * temp = NULL;
temp = (Teacher *)malloc(sizeof(Teacher) * num);
if (temp == NULL)
return NULL;
memset(temp,0,sizeof(Teacher) * num);
return temp;
}
int createTeacher_02(Teacher ** t,int num){
Teacher * temp = NULL;
temp = (Teacher *)malloc(sizeof(Teacher) * num);
if (temp == NULL)
return -1;
memset(temp,0,sizeof(Teacher) * num);
int i = 0;
for (i = 0;i < num;i++){
temp[i].Name = (char *)malloc(60);
}
*t = temp;
return 0;
}
void FreeTeacher(Teacher * t,int num){
if (t == NULL)
return ;
int i = 0;
for (i = 0;i < num;i++){
if (t[i].Name != NULL){
free(t[i].Name);
}
}
free(t);
}
* 结构体与二级指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct Teacher{
int age;
char * Name;
char ** StuName;
}Teacher;
int createTeacher(Teacher ** t,int num);
void FreeTeacher(Teacher * t,int num);
int main()
{
int result = 0;
Teacher * Tarr = NULL;
result = createTeacher(&Tarr,3);
if (result){
printf("memery error!");
return 0;
}
int i = 0 ,j = 0;
char name[20] = {0};
for (i = 0;i < 3;i++){
Tarr[i].age = (i+1);
sprintf(name,"%s%d","name:",i);
strcpy(Tarr[i].Name,name);
for(j = 0;j < 3;j++){
sprintf(name,"%s%d%d","sname:",i,j);
strcpy(Tarr[i].StuName[j],name);
}
}
for (i = 0;i < 3;i++){
printf("age = %d\n",Tarr[i].age);
printf("name = %s\n",Tarr[i].Name);
for (j = 0;j < 3;j++){
printf("\tstuname = %s\n",Tarr[i].StuName[j]);
}
printf("=================\n");
}
FreeTeacher(Tarr,3);
return 0;
}
int createTeacher(Teacher ** t,int num){
Teacher * temp = NULL;
temp = (Teacher *)malloc(sizeof(Teacher) * num);
if (temp == NULL){
return -1;
}
memset(temp,0,sizeof(Teacher) * num);
int i = 0, j = 0;
for (i = 0;i < num;i++){
temp[i].Name = (char *)malloc(60);
char ** pt = (char ** )malloc(sizeof(char *) * 3);
for (j = 0;j < 3;j++){
pt[j] = (char *)malloc(60);
}
temp[i].StuName = pt;
}
*t = temp;
return 0;
}
void FreeTeacher(Teacher * t,int num){
if (t == NULL){
return ;
}
int i = 0, j = 0;
for (i = 0;i < num;i++){
if (t[i].Name != NULL){
free(t[i].Name);
}
char ** ptr = t[i].StuName;
for (j = 0;j < 3;j++){
if (ptr[i] != NULL){
free(ptr[i]);
}
}
free(ptr);
t[i].StuName = NULL;
}
free(t);
}
* 数组合并
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int strArray(char ** str1,int len1,char (*str2)[10],int len2,char *** strArr,int * Arrlen);
void FreeArray(char ** arr,int len);
void FreeArray_02(char *** arr,int len);
int main()
{
return 0;
}
int strArray(char ** str1,int len1,char (*str2)[10],int len2,char *** strArr,int * Arrlen){
char ** ArrayList = NULL;
int i = 0 , j = 0;
ArrayList = (char **)malloc(sizeof(char *) * (len1 + len2));
if (ArrayList == NULL){
return -1;
}
memset(ArrayList,0,sizeof(char*) * (len1 + len2));
int length = 0;
for (i = 0;i < len1;i++){
length = strlen(str1[i]) + 1;
ArrayList[i] = (char *)malloc(length);
strcpy(ArrayList[i],str1[i]);
}
for(j = 0;j < len2;j++,i++){
length = strlen(str2[j]) + 1;
ArrayList[i] = (char *)malloc(length);
strcpy(ArrayList[i],str2[j]);
}
*strArr = ArrayList;
*Arrlen = (len1 + len2);
return 0;
}
void FreeArray(char ** arr,int len){
if (arr == NULL){
return;
}
char ** pstr = arr;
int i = 0;
for (i = 0;i < len;i++){
if (pstr[i] != NULL){
free(pstr[i]);
}
}
free(pstr);
}
void FreeArray_02(char *** arr,int len){
if (arr == NULL){
return;
}
char ** pstr = *arr;
int i = 0;
for (i = 0;i < len;i++){
if (pstr[i] != NULL){
free(pstr[i]);
}
}
free(pstr);
*arr = NULL;
}
* 结构体中的浅拷贝和深拷贝
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct Temp{
int data;
char * text;
}Temp;
void copyTemp(Temp * to,Temp * from);
int main()
{
Temp temp1,temp2;
memset(&temp1,0,sizeof(temp1));
memset(&temp2,0,sizeof(temp2));
temp1.data = 10;
temp1.text = (char *)malloc(60);
strcpy(temp1.text,"aaaaaa");
copyTemp(&temp2,&temp1);
if (temp1.text != NULL){
free(temp1.text);
temp1.text = NULL;
}
if (temp2.text != NULL){
printf("[%s]\n",temp2.text);
free(temp2.text);
temp2.text = NULL;
}
return 0;
}
void copyTemp(Temp * to,Temp * from){
*to = *from;
*to = *from;
to->text = (char *)malloc(60);
strcpy(to->text,from->text);
}
* 结构体中的偏移量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct Adv{
char name[64];
int age;
char * text;
}Adv;
int main()
{
Adv * p = NULL;
int offsize = (int)(&(p->age));
offsize = (int)(&(((Adv*)0)->age));
p = (Adv*)malloc(sizeof(Adv));
strcpy(p->name,"芦苇微微");
p->age = 16;
p->text = (char *)malloc(64);
strcpy(p->text,"一笑奈何");
void * pstr = NULL;
pstr = (int)(&(p->age)) - offsize;
printf("%s\n",((Adv*)pstr)->name);
printf("%s\n",((Adv*)pstr)->text);
printf("%d\n",((Adv*)pstr)->age);
return 0;
}
* 文件操作(fgetc & fputc[单个字符读取/写入])
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int writeFile(const char * path,char * data);
int readFile(const char * path);
int main()
{
char * data = "Talent is continuing patience!\n";
char * path = "D:/Test/1.txt";
writeFile(path,data);
readFile(path);
return 0;
}
int writeFile(const char * path,char * data){
FILE * fp = NULL;
fp = fopen(path,"r+");
if (fp == NULL){
return -1;
}
int i = 0;
for (i = 0;i < strlen(data);i++){
fputc(data[i],fp);
}
if (fp != NULL){
fclose(fp);
}
return 0;
}
int readFile(const char * path ){
FILE * fp = NULL;
if ((fp = fopen(path,"r+")) == NULL){
return -1;
}
while (!feof(fp)){
char str = fgetc(fp);
printf("%c",str);
}
if (fp != NULL)
{
fclose(fp);
}
return 0;
}
r 以只读方式打开文件,只允许读取,不允许写入。该文件必须存在。
r+ 以读/写方式打开文件,允许读取和写入。该文件必须存在。
rb+ 以读/写方式打开一个二进制文件,允许读/写数据。
rt+ 以读/写方式打开一个文本文件,允许读和写。
w 以只写方式打开文件,若文件存在则长度清为0,即该文件内容消失,若不存在则创建该文件。
w+ 以读/写方式打开文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以追加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留)。
a+ 以追加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符 不保留)。
wb 以只写方式打开或新建一个二进制文件,只允许写数据。
wb+ 以读/写方式打开或建立一个二进制文件,允许读和写。
wt+ 以读/写方式打开或建立一个文本文件,允许读写。
at+ 以读/写方式打开一个文本文件,允许读或在文本末追加数据。
ab+ 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。
* 文件操作(fgets [按行读取])
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int readFile(const char * path);
int main()
{
char * path = "D:/Test/1.txt";
readFile(path);
return 0;
}
int readFile(const char * path){
FILE * fp = NULL;
if ((fp = fopen(path,"r+")) == NULL){
return -1;
}
char buf[1024] = {0};
char * pstr = NULL;
while ((pstr = fgets(buf,1024,fp)) != NULL){
printf("%s",pstr);
}
if (fp != NULL){
fclose(fp);
}
return 0;
}
* 文件操作(fread & fwrite[按结构体格式读取/写入内容])
typedef struct Teacher{
char name[12];
int age;
}Teacher;
int readFile(char * path);
int writeFile(const char * path,Teacher * t);
int main()
{
char * path = "D:/Test/2.txt";
Teacher t[3] ;
memset(&t,0,sizeof(Teacher) * 3);
int i = 0;
for (i = 0;i < 3;i++){
sprintf(t[i].name,"%d%d%d",(i+3),(i+3),(i+3));
t[i].age = (i+5);
}
writeFile(path,t);
readFile(path);
return 0;
}
int writeFile(const char * path,Teacher * t){
FILE * fp = NULL;
if ((fp = fopen(path,"wb")) == NULL){
return -1;
}
int i= 0;
int count = 1;
for (i = 0;i < 3;i++){
if (count != fwrite(&t[i],sizeof(Teacher),count,fp)){
return -1;
}
}
if (fp != NULL){
fclose(fp);
}
return 0;
}
int readFile(char * path){
FILE * fp = NULL;
if ((fp = fopen(path,"rb+")) == NULL){
return -1;
}
Teacher t[3];
memset(&t,0,sizeof(Teacher) * 3);
int i = 0;
int count = 1;
for (i = 0;i < 3;i++){
if (count != fread(&t[i],sizeof(Teacher),count,fp)){
return -1;
}
}
for (i = 0;i < 3;i++){
printf("%s - %d\n",t[i].name,t[i].age);
}
if (fp != NULL){
fclose(fp);
}
return 0;
}
* 按(key=value)的形式读写文件
====>MAIN.C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "readCFG.h"
int main()
{
return 0;
}
====>READCFG.H
#ifndef READCFG_H_INCLUDED
#define READCFG_H_INCLUDED
int getReadCFGFile(const char * path,const char * key,char * value,int * valuelength);
int setReadCFGFile(const char * path,const char * key,const char * value);
#endif
====>READCFG.C
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 1024
int getReadCFGFile(const char * path,const char * key,char * value,int * valuelength){
FILE * fp = NULL;
char * pTmp = NULL;
char * pstr = NULL;
char BUF[MAX] = {0};
int flag = 0;
if ((fp = fopen(path,"r+")) == NULL){
return -1;
}
while ((pstr = fgets(BUF,MAX,fp)) != NULL){
if ((pstr = strchr(BUF,'=')) == NULL || (pstr = strstr(BUF,key)) == NULL){
continue;
}
flag = 1;
pTmp = BUF + strlen(BUF) - 1;
pstr = BUF + strlen(key) + 1;
for (;*pstr == ' ';pstr++);
for (;*pTmp == ' ' || *pTmp == '\n';pTmp--);
break;
}
if (!flag){
return -1;
}
*valuelength = (int)(pTmp - pstr) + 1;
memcpy(value,pstr,*valuelength);
if (fp != NULL){
fclose(fp);
}
return 0;
}
int setReadCFGFile(const char * path,const char * key,const char * value){
if(path == NULL || key == NULL || value == NULL){
return -1;
}
FILE * fp = NULL;
char * pstr = NULL;
char BUF[MAX] = {0};
char FILEBUF[MAX * 8] = {0};
int length = 0;
int flag = 0;
if ((fp = fopen(path,"r+")) == NULL){
return -1;
}
fseek(fp,0,SEEK_END);
length = ftell(fp);
fseek(fp,0,SEEK_SET);
if(length > MAX * 8){
return -1;
}
while ((pstr = fgets(BUF,MAX,fp)) != NULL){
if ((pstr = strstr(BUF,key)) != NULL){
flag = 1;
sprintf(BUF,"%s = %s\n",key,value);
strcat(FILEBUF,BUF);
}else{
strcat(FILEBUF,BUF);
}
}
if (!flag){
sprintf(BUF,"%s = %s\n",key,value);
strcat(FILEBUF,BUF);
}
if(fp != NULL){
fclose(fp);
fp = NULL;
}
fp = fopen(path,"wt+");
fputs(FILEBUF,fp);
if(fp != NULL){
fclose(fp);
}
return 0;
}