结构体
1.1 关键字 struct
1.2 结构体的大小 : 不考虑对齐时,每个字段的大小相加之和就是结构体大小
1.3 访问结构体字段
1.3.1 点运算符 : 结构体变量名.字段名
1.3.2 指针分量运算符: 结构体指针变量名->字段名联合体
2.1 关键 union
2.2 联合体的大小 : 就是联合体中占空间最大的字段的大小.
访问结构体字段
2.3 访问联合体字段
2.3.1 点运算符 : 联合体变量名.字段名
2.3.2 指针分量运算符: 联合体指针变量名->字段名堆空间
3.1 malloc
3.1.1 realloc , calloc
3.2 free
3.3 memset(内存初始化) ,
memcpy (内存拷贝),
memcmp (内存比较),
memmove(内存移动)高级指针
1.1 指针变量运算
1.2 指针的类型.
1.2.1 保存整型变量的地址 , 可以整型指针
1.2.2 保存一维数组的地址 , 可以用一级指针
1.2.3 保存二维数组的地址 , 一维数组指针.
void fun(int* arr , int nWidth , int nHeight){
// 怎么用一级指针遍历二维数组
// 1 2
// 3 4
// 5 6
for(int i = 0; i < nHeight;++i){
for(int j = 0;j<nWidth;++j){
// 行号 * 宽度 + 列号
arr[ i * nWidth + j ];
}
}
}
int main()
{
int a[3][2];
fun((int*)a , 2 , 3);
}
堆
#include "stdafx.h"
#include <stdlib.h>
// 定义一个宏,用于执行两条语句:释放堆空间,将指针置为空
#define FREE(p) free(p); p = NULL;
typedef struct MyStruct {
int nNum;
}MyStruct;
int main(){
MyStruct* pObjs = NULL;
// 申请10个结构体类型的堆空间
pObjs = (MyStruct*)malloc( 10 * sizeof( MyStruct ) );
if( pObjs == NULL ) {
printf( "堆空间申请失败\n" );
return 0;
}
pObjs[ 0 ].nNum = 0; // 使用堆空间中第0个元素
pObjs[ 1 ].nNum = 0; // 使用堆空间中第1个元素
// 释放堆空间
FREE( pObjs );
// 申请
int* pBuff = NULL;
pBuff = (int*)malloc( 10 * sizeof( int ) );
if( pBuff == NULL ) {
printf( "堆空间申请失败\n" );
return 0;
}
// 初始化
memset( pBuff ,/*要初始化的内存首地址*/
0 , /*要初始化的值*/
10 * sizeof( int )/*初始化的字节数*/ );
// 释放
FREE( pBuff );
return 0;
}
联合体和结构体
#include "stdafx.h"
struct MyStruct {
char cNum;
int nNum;
double dNum;
};
union MyUnion {
char cNum;
int nNum;
double dNum;
};
int main()
{
MyStruct stcObj;
MyUnion uni = { 0 };
uni.cNum = 'A';
printf( "%x" , uni.nNum );
uni.nNum = '15PB';
printf( "%c" , uni.cNum );
return 0;
}
二维数组和指针
#include "stdafx.h"
void fun( int( *pArr )[ 2 ] ) {
}
int main( ) {
int arr[ 3 ][ 2 ] = { 1,2,3,4,5,6 };
int( *pArr )[ 2 ] = arr;
pArr[ 0 ][ 1 ] = 0;
fun( arr );
int arr2[ 2 ][ 3 ][ 4 ];
int( *pArr2 )[ 3 ][ 4 ] = arr2;
// 数组指针 : 保存数组地址的指针
// 指针数组 : 保存指针的数组
char* pArr3[ 5 ] = { "123","456","789","abcd","efghi" };
//int* p = arr;
return 0;
}