指针、数组、结构体

const 修饰只读变量,用法如下几种:

1、const int p;
2、int *const q;
3、int const *z;
4、const int *a;
5、const int * const b;

第一个 是把p定义为一个只读变量,p的值不会改变,但是可以通过地址改变里面内容的值,但是不能通过p来修改对应内存的值;

第二个是给指针q做了只读修饰,效果是q不能变,q原本是什么值就是什么值所以不能进行q++这种操作,但是可以修改指针所指向的地址的内容的值,即可以(*p) ++;

第三个是指针指向内容的值不可以改变,但是指针可以随意移动,即可以z++但是不能*z++;

第四个和第三个是一样的;

最后一个其实是第三个和第二个的结合,既不能对指针的值进行改变也不能进行指针指向的地址内容的改变;

结构体:定义如下

struct student
{
    int id;
    char name[20];
    char sex;
};

末尾的分号;不能少,如果想声明一个相同类型的结构体可以进行如下操作:

struct strdent  stu1,stu2;

这样就声明了两个studen结构体stu1 和 stu2;

可以进行初始化代码如下:

1、struct student stu1 = {1, lilei, m};
2、printf("%d  %s  %c\n",stu1.id, stu1.name, stu1.sex);//这是打印结构体的方式
3、struct student  *stu3 = (struct student*)malloc      //给结构体指针数组进行初始化需要分配
 (sizeof(struct student));                              //空间,避免成为野指针
                                                     
4strcpy(stu3->name, "lilei");                       //用指针给结构体赋值
 stu3->age = 21;
  stu3->sex = f;

需要补充的是用指针给结构体赋值还有另外的方法是从键盘输入,需要注意的是用输入的方式 时如果结构体内的元素是字符串或者是一些不需要取地址的数组之类的不用加&,但是如果是一些int型变量需要在前面加上&符号;

关于结构体长度的计算需要注意三个原则:1、一定是最长成员的整数倍(double)除外;2、每个成员的偏移量一定是该成员长度的整数倍,3、对于有嵌套结构体或成员之中有数组的一律展开来看,比如int [10];需要的是40个字节,但是要看成是10个int型变量的川成元累加;

最后关于内存的分配问题:4G的空间中有1G是内核态,有3G是用户态,我们需要的都是用户态里面,所以用户态里面又分为数据段、代码段、栈、堆等

数据段:存放全局变量 static 静态变量

代码段:存放代码、常量、和一些只读段;

栈:存放局部变量;

堆:存放用malloc函数分配的空间

猜你喜欢

转载自blog.csdn.net/LX370ZZZ/article/details/81274916
今日推荐