20150126 【 ARM 】 C语言+结构体

来源:互联网 发布:数据科学与r语言 编辑:程序博客网 时间:2024/05/17 22:46
指针常量
指向常量的指针:指针所指向的内容不能用这个指针来修改(应用在函数传参)
const char *p
char const *p

char a = ‘a’;
const char *p = &a;

a = 'b';对
*p='b';错误
常指针:所指向的地址不能改变,但是里面的内容可以被改变,常指针定义时候必须初始化
char * const p ;

char ch = ‘a’;
char *const p = &a;

指向常量的常指针
const char* const p



结构体:自定义数据类型
struct 结构体名
{
结构体成员;
};

特点:结构体声明不占用内存, 当定义对象时候才分配内存空间
结构体:空间是连续大小是成员所占大小总和

比如:整个班级信息保存
struct Student
{
char name[32];
char sex;
char address[128];
int age;
};

定义结构体对象
char name[10];
name = "zhangsan";(error)
strcpy(name, "zhangsan");(ok)

对象初始化1
struct Student zhangsan = {"zhangsan", 'm', "changsha", 18};
zhangsan = {"zhangsan", 'm', "changsha", 18};(error)

对象初始化2
struct Student zhangsan;
zhangsan.name = "zhangsan";(error)
strcpy(zhangsan.name, "zhangsan");
zhangsan.sex = 'm';
strcpy(zhangsan.address, "changsha");
zhangsan.age = 18;

//对象初始化3
struct Student zhangsan = {.name="lisi", .sex='w',.age=19, .address="frgc"};

设计一个学生结构体,定义一个结构体对象,保存张三的个人信息(姓名,年龄, 性别)

struct Student 
{
char name[32];
char sex;
int age;
};

struct Student zhangs;
scanf("%s", zhangs.name);//读取缓冲区回车字符
while(getchar() != '\n');
scanf("%c", &zhangs.sex);
while(getchar() != '\n');
scanf("%d", &zhangs.age);

printf("%s:%c:%d\n", zhangs.name, zhangs.sex, zhangs.age);

结构体大小计算:连续的空间,所有成员大小总和,考虑字节对齐(四字节对齐,二字节对齐)
struct Student 
{
char name[32];---32==4*8
char ch;----1*4
int data;----1*4
char s;---1*4
char sex;
int age;---1*4
};-----37

sizeof(struct Student) = 48;

先看结构体成员1.最大数据类型如果最为2个字节,分配空间就以2字节对齐每次分2个字节,
 2.最大数据类型超过2个字节就以4字节对齐,分配空间一次分配4个字节,
 3.当分配空间本成员没有用完,如果可以完全存下下一个成员就把空间使用,不能存下就丢弃,
   重新分配

练习:计算结构体大小
struct Std
{
char name[31];
char arr;
int length;
double score;

float hight;
char sex;
long 
short number;
char addr[33];
};
sizeof(struct Std) = ?

自定义数据类型
#define int_32 int
unsigned int_32 a;

typedef unsigned int  uint_32;
uint_32 a;


typedef struct Student 
{
char name[32];
char sex;
int age;
}Student;


struct Student zhangs;
Student zhangs;


struct Student 
{
char name[32];
char sex;
int age;
}zhangs;

//结构体不写结构体名,一般用在结构体内成员
struct Class
{
struct  
{
char name[32];
char sex;
int age;
} student;

int number
}




结构体指针
typedef struct Student 
{
char name[32];
char sex;
int age;
}Student;

Student student;
Student *std = &student;
对象获取成员student.name;
指针获取成员std->name;

内存分配
malloc----用来分配空间(分配空间在堆内存中)
分配连续的以一个字节为单位的空间(返回来的是void *)
void *可以转化为任意类型的指针
Student *std = (Student*)malloc(40);
strcpy(std->name,"lisi");
std->sex = 'm';
std->age = 20;


free----释放malloc分配的空间
free(std);
std = NULL;


存储类型
auto , static, extern , register

auto自动:系统自动分配和释放,(局部变量,存在栈里面)
auto int a = 0;
static静态:存储在数据段,静态变量只初始化一次
static int a = 0;
extern外部: 某个变量在其他文件中已经声明,在本文中要使用可以用extern声明就可以,
(这样的话使用的是同一变量)
    register寄存器:资源稀少,申请为寄存器不一定就是放在寄存器中,
             一旦申请为寄存器变量就不能取地址(不管成功不成功)
register int a = 0;
 
写程序时候:优先使用局部变量,局部解不了在用全局,全局解决不了用外部

int main(int argc, char *argv[])
{
printf("%p", &argc);
}


程序内存分布
栈:系统自动分配和释放,存储(auto, 局部变量)
堆:是由用户分配和释放,malloc分配,free释放
数据:全局变量, 静态变量, 常量



实验6提示:
6-6变长数组
int n;
n=?
int a[n];

另外一种变长数组
struct A
{
int a[1];
}
struct A *ma = (A*)malloc(100*sizeof(int));
ma->a[]

0 0