int ar[]={1,2,3,4,5};
int *p =&ar[0];
printf("%d\n",p);
p++;//p加1后打印出来差4,为1个int变量占用字节数
printf("%d\n",p);
//通类值运算
int *q=&ar[4];
printf("%d\n",q-p);//值为4,同类指针相减,以数据长度减
-
数组和指针
//数组名为数组首地址
int ar[5]={1,2,3,4,5};
int *p=ar;// ar+1 等于p+1
//ar ar+1 ar+2
//p p+1 p+2
//*(ar+1) 得 ar数组第2个的值,等于ar[1]
//ar[0] ar[1] ar[2]
//*ar *(ar+1) *(ar+2)
//p[0] p[1] p[2]
-
结构体
void main()
{
int a[]={5,8,3,7,3};
int y,*p=&a[1];
y=(*--p)++; \\(*--p)表示内存 内存内容++
printf("%d\n",y);\\5
printf("%d\n",a[0]);\\6
}
\\结构体是有基本数据类型构成的,数据类型(其他数据类型组合)
\\关键字 struct
\\结构体变量内存地址是结构体变量第一个元素的地址
struct Person{
int id;
char name[10];
};
void main()
{
//定义结构体数据类型变量
//初始化
struct Person person={
1,"xingming"
};
printf("%d\n",sizeof(person));
printf("%d\n",&person);
printf("%d\n",person.id);
printf("%s\n",person.name);
}
//结构体指针变量通过->方式去引用结构体变量的成员
void main()
{
struct Person person={
1,"xingming"
};
struct Person *p= &person;
printf("%d\n",p);
printf("%d\n",*p);//在结构体中不可行
printf("%d\n",p->id);
}
//结构体的指针可改变变量内容
struct Person{
int id;
char name[10];
char f;
}P={1,"static",'A'};//全局变量
void main()
{
struct Person *p= &P;
p->f = 'c';
printf("%c\n",P.f);
}
-
typedef 类型定义
例如
typedef int I;
I就代表int,可以用来定义对象等如
I i;
用于模块
typedef struct{
int id;
char name;
}Person;
使用时直接
void main()
{
Person *p= &P;
p->f = 'c';
printf("%c\n",P.f);
}
-
函数指针
//函数被编译执行,会占用内存,内存有个地址。可以通过指针使用函数,想使用变量地址一样
//函数地址是函数的名字
struct Person{
int id;
char name[10];
char f;
}P={1,"static",'A'};//全局变量
void printPersonInfo(struct Person person){
printf("%d",person.id);
}
void main()
{
//函数指针,调用函数的,定义:函数返回类型,(*f),函数参数类型列表
void(*f)(struct Person)=printPersonInfo;
//函数内存地址
printf("%d\n",printPersonInfo);
//通过指针调用函数
(*f)(P);
}
-
内存分配
//方法内部定义的变量在栈内分配,在方法结束后栈内存被回收
//解决,方法外部定义变量(全局变量),内存在静态存储区存放
//解决,方法内部定义,加一个关键字static,在内存静态存储区存放
//静态存储区变量生命周期作用于整个程序运行时
char* getStr(){
char ch[]="hello word";
printf("字符串ch地址%d\n",ch);
printf("字符串内容%s\n",ch);
return ch;//返回后,内存被回收了
}
void main()
{
char* str=getStr();
//与之前一样
printf("str地址%d\n",str);
//与之前不一样,内存已被回收
printf("str地址%s\n",str);
}
-
堆内存
//堆内存 解决方式
//堆内存 java ,c++ Object o= new Object();
//堆内存 c void* v= malloc(申请内存字节大小)// void 可以指向任意类型
//堆内存 程序退出也不会回收,需要程序员回收 free(void*)
char* getStr(){
char ch[]="hello word";
//字符串放到堆内存
void* v= malloc(sizeof(ch));
//ch copy到v指向堆内存 memcpy(void* des,void* src,int size);
memcpy(v,ch,sizeof(ch));
printf("字符串v地址%d\n",ch);
printf("字符串内容%s\n",ch);
return v;
}
void main()
{
char* str=getStr();
printf("str地址%d\n",str);
printf("str地址%s\n",str);
}
-
预处理指令
//程序编译时处理
//常用
# define PI 3.14; //定义PI为3.14,使用时每次用PI
# define max(x,y) x>y?x:y
#include<stdio.h> //将stdio.h文件包含进来,编译时处理
-
文件读写字节方式
//用fopen从硬盘,以读的方式导入内存,返回文件指针
//需导入stdio.h文件,FILE是结构体
main(){
//param1,文件在硬盘文件名,param2文件操作 r读,w写 ,a二进制
FILE *f1=fopen("file1.c","r");
FILE *f2=fopen("file1.txt","w");
//fgetc(FILE *_File)读取文件,读取一个字节内容,返回int,-1结束;每调用一次文件指针向下移
//EOF,宏定义代表-1
//fputc(int _ch,FILE *_File),将_ch 字节内容,存放到*_file所指的文件
int c;
while((c=fgetc(f1)!=EOF){
printf("%c",c);
fpuc(c,f2);
}
//关闭文件,回收内存,写的话,将内存文件写入硬盘
fclose(f1);
fclose(f2);
//c代码执行当前系统下命令,例windows
System(“notepad file1.txt)
}
-
输出文件打印行号