数据结构二
/*
2012/4/6
*/
指针和结构体
#include < stdio.h >
int main()
{
double * p;
double x = 66.6;
p = &x;
//x 本身占4个字节,一个字节八位
//一个字节一个地址,8位一个地址
//那 x占四个字节,一个字节一个地址,一共就有8个地址
//那么 , p里面放的只是一个地址,存放的是首地址/末地址
用第一个字节的地址表示整个变量
double array[2] = {2,4};
p = array;
printf("%p",p);//十六进制输出
printf("%p",p+1) ; //两个数会差四个字节
!!!!!!!!!!!!!!!!
所有的指针变量都是占四个字节
因为:
地址都是四个字节而已
32位地址总线
2^32 -1 【 4G - 1 】
!!!!!!!!!!!!!!!!
return 0;
}
结构体
1.什么叫结构体
2.如何使用结构体
3.注意事项
struct student
{
int age;
char name[20];
}name;
//定义一个数据类型student,它的别名叫做name
int main(void)
{
struct student s1;
//s1.age = 14; 第一种方式
一般我们不用名字来调用结构体,因为我们不可能知道那么多的名字
因为:我们不可能对每个内存都定义变量名,然后再用变量名。的方式来调用
我们用一个指针变量P来搞定
struct student * pst ;
//理论上,struct student 占4+20 =24个字节
//那么,struct student * 占多少个字节?
// 占 4 个 —— 指针变量
pst = &s1;
pst -> age =5; // 等价于 s1.age
!!!!!!!!!!!!!!!!!
pst ->age
表示:pst指向的结构体变量的age成员
!!!!!!!!!!!!!!!!!
注意事项:
1.结构体变量 不能加减乘除,但是可以相互赋值
2.普通结构体变量 和 结构体指针 作为函数参数 传递
struct student s1;
s1 内存有为它分配空间
相当于 int i;
全部属于静态变量
通过f函数来修改s1里面的值
void f(struct student * pst)
{
//将s1的地址传给pst
而不是把整个变量传过去
pst -> age =5;
strcpy(pst->name ,"lisi");
}
strcpy(s1.name,"lisi");
printf("%d,%s",s1.age,s1.name);
return 0;
}
class student
{
int sid;
string name;
int age;
void inputStudent()
{}
void ouputStudent()
{}
}
动态内存分配
new delete
malloc free
#include <stdio.h>
int main()
{ int a[5] = {1,2,3,4,5};
//定义一个静态数组
//动态使用数组,在运行的过程当中,不知道到底数组的长度是多少
int len;
printf("请输入您所需要分配的数组长度\n");
scanf( "%d" , &len);
int * pArr = (int *)malloc(sizeof( (int) *len );
//定义了一个 指针,指向 内存为 大小为sizeof( (int) *len 的首地址
//malloc 返回变量第一个的地址
//int * 表示:告诉系统,这个地址其实是整型变量的地址
因为:无论是double类型的还是int类型的首址都是一样四个字节
系统没有办法判断到底是 double还是int
所以要用强制类型转换 ( int *)
// (int) *len 是 4 * len;
( pArr + 3 ) -> age = 4; //等价于 pArr[3].age = 4;
//这个时候我们可以把pArr当做普通数组来使用
free(pArr); //把pArr所控制的 4*len个字节的内存释放
return 0;
}