关于C的复习

来源:互联网 发布:淘宝卖虚拟商品 编辑:程序博客网 时间:2024/05/21 00:16

1.

#include<stdio.h>

void main()
{
   char p;
   char buf[10]={1,2,3,4,5,6,9,8};
   p=(buf+1)[5];
   printf("%d\n",p);
   

}

打印结果为9。 此题buf表示数组的首地址,相当于一个指向数组首地址的指针常量,buf+1表示指针指向数组首地址之后一个,(buf+1)[5]表示从(buf+1)开始,下标为5的元素。

2.

#include<stdio.h>
void main()
{
   int a[][3]={1,2,3,4,5,6};
   int (*ptr)[3]=a;
   printf("%d,%d,%d,%d\n",(*ptr)[1],(*ptr)[2],(*ptr)[3],(*ptr)[4]);
 
}

打印结果2,3,4,5

int (*ptr)[3]是一个数组指针,指向a数组,二维数组按行存储。因为数组里面的元素是连续存储的,所以(*ptr)[3],(*ptr)[4]也是可以打印出来的。

3.

3.1

#include<stdio.h>
void main()
{
  struct
  {
    char a;
    short  b;
    float c;
 
  }cs;
  printf("%d\n",sizeof(cs));
 
 }

需要考虑到系统在存储结构体变量时的地址对齐问题,结果为8

偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大。显然,结构体变量中第一个成员的地址就是结构体变量的首地址。因此,第一个成员a的偏移量为0。第二个成员b的偏移量是第一个成员的偏移量加上第一个成员的大小

存储变量时地址要求对齐,编译器在编译程序时会遵循两条原则:

      (1)结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) 

      (2)结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数

3.2

结构体中包含数组

struct ss

{

    float f;

    char p;

   int a[3];

};

  其值为20。float占4个字节,到char p时偏移量为4,p占一个字节,到int adf[3]时偏移量为5,扩展为int的整数倍,而

 非int adf[3]的整数倍,这样偏移量变为8,而不是12。结果是8+12=20,是最大成员float或int的大小的整数倍。

3.3

结构体中包含结构体




4.strcmp

strcmp(char *s1,char *s2)

s1==s2,返回0

s1>s2,返回一个正数

s1<s2,返回一个负数

0 0
原创粉丝点击