C语言-(指针、动态分配内存、结构体、创建文件)

2019-08-04  本文已影响0人  宁晓鸯

心得体会


技术


操作以及操作详解

其实指针就像是其它变量一样,所不同的是一般的变量包含的是实际的真实的数据,而指针包含的是一个指向内存中某个位置的地址。

2.为什么要使用指针

a.指针解决跨区域(不同作用域 不同代码块)之间的数据交互
b.为函数提供修改调用变元的灵活手段;
c.支持C 语言动态分配子程序
d.可以改善某些子程序的效率
e.为动态数据结构(如二叉树、链表)提供支持

3.指针中符号-------------'*'表示的含义

a.声明定义变量的时候 表示一个指针变量
int*a//定义指针变量
int *temp=&c//定义指针变量
b.除了定义指针变量之外 都是访问个地址的值
*temp=21;//访问temp地址里面的数据 赋值为21

4.指针的使用注意事项

a.int *a;此时定义一个指针变量,指向的内存空间只能存放整数
b.定义指针变量的时候一定要赋初值

c.
float b=20;
int c=10;
int *a=b; //错误;指针变量只能存地址,不能存具体值***a=&b)`
int *a=&b;//错误 整形指针只能存整形数据的地址
int *a=&c;//正确
float *d=NULL;//NULL指向内存的首地址 0x00
d.
#include <iostream.h>
  int test(int a){
    return 0;
 }
 int main(int argc, char *argv[])
  { int a=10;
    int *pa=&a;

    int a2[10]={};
    int *pa2=a2;

    int(*pFunc)(int )=test;//这是一个函数,函数的函数名实际上就是这个代码在内存中的首地址,所以test前面不加& 
    printf("%lu\n",sizeof(a)); //4
    printf("%lu\n",sizeof(*pa));//8
    printf("%lu\n",sizeof(a2));//40
    printf("%lu\n",sizeof(*pa2));//8
    printf("%lu\n",sizeof(pFunc));//8
  //sizeof判断某一种类型在内存里面占据的内存空间是多少 
    system("pause"); 
    return 0;
}

5.指针与数组的关系

a.数组名并不是 一个变量 没有分配内存空间 int a=10;指针变量是有内存空间的
b.定义一个数组,系统会分配内存空间;定义一个指针变量 只为变量本身分配8个字节内存空间

  #include <iostream.h>
   int main(int argc, char *argv[])
  {int score[5]={39,32,34,67,89};
    printf("%p\n",score);
    printf("%p\n",&score);
    system("pause");
    return 0;
}
QQ截图20190803225355.png

从上述结果可以看出两种输出结果是一样的,故由此可得:数组名其实就是数组的首地址


int score[5]={39,32,34,67,89};
    for(int i=0;i<5;i++){
        printf("%d ",score[i]);
    }
    
    for(int i=0;i<5;i++){
        printf("%d ",*(score+1));
    }
QQ截图20190803231800.png
int score[5]={39,32,34,67,89};
    printf("%p\n",score);
    printf("%p\n",score+1);
    printf("%d\n",*(score+1));
    printf("%d\n",*score+1);
QQ截图20190803232146.png
int score[5]={39,32,34,67,89};
    printf("%d\n",(*score)++);
    printf("%d\n",score[0]);
    printf("%d\n",++*score);
QQ截图20190803232445.png

注意!!!
这里有一个坑,第一次打印是39,第一次打印过后就加1变成了40,所以第二次打印是40;


a.自己分配的内存必须自己释放,普通变量的内存是系统自己分配, 所以系统自己负责释放
b.步骤:创建了一个内存空间--->判断分配是否成功--->当之前分配的内存空间多了或少了 ,就需要在之前前的基础上重新分配--->内存空间用完后需立刻释放内存空间

char *pName=malloc(10*sizeof(char));//创建了一个内存空间
if(pName==NULL){//判断分配是否成功
    //r如果分配失败
    return;(exit(EXIT_FAILURE))
}
pName[0]='j';
pName[1]='a';
pName[2]='c';
printf("%s",pName);
//当之前分配的内存空间多了或少了 就需要在职期前的基础上重新分配
//realloc 必须是之前使用malloc分配过的
pName=realloc(pName,4*sizeof(char));//重新分配内存空间
pName[3]='k';
free(pName);//用完了就要自己释放内存

结构体是一种数据类型 复合数据类型

//声明一种类型 struct Person
struct Person{
    char name[10];
    char *addr;
    int age;
};
//定义结构体变量 变量名为xw

struct Person xw;
xw.name="小王";//错误!!!
xw.name[0]='x';//正确

数组一旦定义 地址不能改变;
不能直接给数组赋值;

把什么东西写到文件里---这个东西有多大---写到哪里去---写几个


1.把结构体写到文件
步骤:打开电脑的cmd---将你想要写的文件的地址的任意一个文件拖到cmd中----将文件名改为你所要创建的文件名----得到文件的完全路径---把完全路径写入fopen()中

#include <stdio.h>

int main(int argc, char *argv[])
{ 
    FILE *fp=fopen("C:/Users/Administrator.000/Desktop/abcd.txt","w");
    struct Student{
        char name[10];
        int age;
    };
struct Student xw1={"xiaowang",20};
fwrite(&xw1,sizeof(struct Student),1,fp);
system("pause");
return 0;
}
K)3IUNYPHB[]~NEMMPXPW~Q.png
RZBDXGF{U0AJD3~JHN()DXC.png

2.接下来以只读方式打开文件

int main(int argc, char *argv[])
{ 
    FILE *fp=fopen("C:/Users/Administrator.000/Desktop/abcd.txt","r");
    struct Student{
        char name[10];
        int age;
    };
    struct Student xw1;
    fread(&xw1,sizeof(struct Student),1,fp);
    printf("name:%s\n",xw1.name);
    printf("age:%d\n",xw1.age);
    fclose(fp);

    system("pause");
    return 0;
}
QQ截图20190804001929.png

在调用 fopen() 函数时,这些信息都必须提供,称为“文件打开方式”。最基本的文件打开方式有以下几种:


QQ截图20190804144435.png

文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法为:
int fclose(FILE *fp);
fp 为文件指针。例如:
fclose(fp);
文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。

上一篇 下一篇

猜你喜欢

热点阅读