1.当数组当作函数参数的时候会退化为指针
#include<stdio.h> #include<stdlib.h> void sort(int a[]){ int num = sizeof(a); printf("数组的大小num=%d ", num);//打印4,此时a是一个指针 //打印数组 for (int i = 0; i < 10; i++) { printf("%5d", a[i]); } } void main(){ int a[10] = {4,3,8,5,1,7,2,9,0,6}; sort(a); system("pause"); }
2.数据类型的本质上是固定内存大小的别名,数据类型的作用是编译器预算对象(变量)分配的内存空间大小
//数据类型的本质 #include<stdio.h> #include<stdlib.h> void main(){ int b = 5;//int数据类型表示:创建int型的变量需要在内存中分配4个字节大小的空间 int a[10] = {4,3,8,5,1,7,2,9,0,6};//int []数据类型表示:创建一个int型数组需要在内存中分配sizeof(int)*10=40个字节大小的空间 char ch = 'a';//char数据类型表示:创建char型的变量需要在内存中分配1个字节大小的空间 float fdata = 1.0;//float数据类型表示:创建float型的变量需要在内存中分配4个字节大小的空间 short sdata = 1;//short数据类型表示:创建short型的变量需要在内存中分配2个字节大小的空间 double dd = 1.0;//double数据类型表示:创建double型的变量需要在内存中分配8个字节大小的空间 char *p = NULL;//char *数据类型表示:创建char *型的指针变量需要在内存中分配4个字节大小的空间, //所以指针类型变量都是分配4个字节大小的内存空间 //结构体,共用体则需要根据各自的特性去计算分配内存空间 }
3.字符串常量因为c++编译器的优化,相同的字符串常量只会在代码去创建一个变量
4.头文件string.h下的strcpy()函数的本质,是将原来字符串str复制到新指针p所指向的内存空间,而不是将原来字符串str的地址赋值给新指针p,因此新指针p必须满足有对应的内存空间(即指针p必须有值)
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> void main(){ char *p = NULL; char *p1 = NULL; strcpy(p, "asadf");//会报错 指针p是空指针,没有对应的内存空间,所以*p会直接读取0x000000的地址,而0x000000是系统专用 //strcpy()的本质 /*while (p==' '){ *p = *p1; p++; p1++; }*/ system("pause"); }
5.对于动态分配的内存而言,并不支持单个内存单元的释放,只能释放整个动态内存
//动态分配内存的释放 #include<stdio.h> #include<stdlib.h> //定义数组大小 #define N 10 void main(){ //创建int类型数组 int *p = (int *)malloc(sizeof(int)*N); for (int i = 0; i < 10; i++) { *(p + i) = i + 5; } for (int i = 0; i < 10; i++) { printf("%5d", p[i]); } //对于动态分配的内存而言,并不支持单个内存单元的释放,只能释放整个动态内存 //例如 //free(p+1); 程序报错 //释放动态内存,只能释放头指针 free(p); //避免野指针,必须将P赋值NULL p = NULL; system("pause"); }
6.数组[]的本质是c/c++编译器帮我们做了一个*p的操作
//数组[]的本质 #include<stdio.h> #include<stdlib.h> //定义数组大小 #define N 10 void main(){ //定义数组 int arr[N] = { 1,2,3,4,5,6,7,8,9 }; //定义数组指针 int *p = arr; //[]取值方式 for (int i = 0; i < N; i++) { printf("%5d",arr[i]); //arr是一个指针;arr[i]===>arr[0+i]===>*(arr+i) } printf(" "); //指针取值方式 for (int i = 0; i < N; i++) { printf("%5d", *(p+i)); } printf(" "); //总结: //*p是程序员手动的使用指针去完成间接取值(赋值) //[]是c/c++编译器帮我们做了一个*p的操作 system("pause"); }