C语言知识

第二章 类型、运算符与表达式

基本数据类型:
char -- 字符型
int  -- 整型
float -- 单精度浮点型
double  -- 双精度浮点型

float和double的精度

const关键字

const int *p = &i; // 指针p指向的内容不能通过p被修改
int * const p = &i; // 指针p本身的内容无法被修改


#include <stdio.h>

int main()
{
    int i = 123;
    const int *p = &i; // 等价于 int const *p = &i;

   //*p = 789; // 错误,指针p指向的内容不能通过p被修改

    printf("i = %d.\n", *p); 

    i = 456;

    printf("i = %d.\n", *p); 

    return 0;
}
#include <stdio.h>

int main()
{
    

    int i = 123;

    int * const p = &i;

    int j  = 456;

    // p = &j;  //错误, p是常量无法修改其值


}

sizeof

当sizeof用于数据类型时,表示该类型占用的字节数

#include <stdio.h>

int main()
{   

    printf("%lu\n", sizeof(char)); 
    printf("%lu\n", sizeof(int)); 
    printf("%lu\n", sizeof(float)); 
    printf("%lu\n", sizeof(double)); 

    return 0;

}
打印结果: 1,4,4,8

当sizeof用于表达式时,表示该表达式结果所占用的字节数

#include <stdio.h>

int main() 
{ 
    int a = 0; 
    double d = 10.21; 
    printf("sizeof(a) = %lu\n", sizeof(a)); 
    printf("sizeof(d) = %lu\n", sizeof(d)); 
    printf("sizeof(a + d) = %lu\n", sizeof(a + d)); 
    return 0; 
} 
sizeof(a) = 4
sizeof(d) = 8
sizeof(a + d) = 8

获取数组长度

#include <stdio.h> 
int main() 
{ 
    int arr[] = { 1, 2, 3, 4, 7, 98, 0, 12, 35, 99, 14 }; 
    printf("Number of elements:%lu \n", sizeof(arr) / sizeof(arr[0])); 
    return 0; 
} 
Number of elements:11

动态申请内存


int* ptr = (int*)malloc(10 * sizeof(int)); 

struct 对齐

参考: Is sizeof for a struct equal to the sum of sizeof of each member?

The sizeof for a struct is not always equal to the sum of sizeof of each individual member. This is because of the padding added by the compiler to avoid alignment issues. Padding is only added when a structure member is followed by a member with a larger size or at the end of the structure.

Different compilers might have different alignment constraints as C standards state that alignment of structure totally depends on the implementation.

针对sizeof(struct)并不是一直等于结构体各个成员所占用字节之和.这是因为编译器会填充空字节来避免对齐的问题.
只有当当前的成员所占内存比后面的成员小或者当前成员位于结构体最后编译器才会进行填充.
不同的编译器可能会有不同的对齐方式.

下面通过几个例子进行展示:

案例1

#include <stdio.h> 
  
int main() 
{ 
  
    struct A { 
  
        // sizeof(int) = 4 
        int x; 
        // Padding of 4 bytes 
  
        // sizeof(double) = 8 
        double z; 
  
        // sizeof(short int) = 2 
        short int y; 
        // Padding of 6 bytes 
    }; 
  
    printf("Size of struct: %ld", sizeof(struct A)); 
  
    return 0; 
} 

输出:

Size of struct: 24

对齐如下:

在这里插入图片描述

案例2

#include <stdio.h> 
  
int main() 
{ 
  
    struct B { 
        // sizeof(double) = 8 
        double z; 
  
        // sizeof(int) = 4 
        int x; 
  
        // sizeof(short int) = 2 
        short int y; 
        // Padding of 2 bytes 
    }; 
  
    printf("Size of struct: %ld", sizeof(struct B)); 
  
    return 0; 
} 

输出:

Size of struct: 16

对齐如下:
在这里插入图片描述

案例3


// C program to illustrate 
// size of struct 
#include <stdio.h> 
  
int main() 
{ 
  
    struct C { 
        // sizeof(double) = 8 
        double z; 
  
        // sizeof(short int) = 2 
        short int y; 
        // Padding of 2 bytes 
  
        // sizeof(int) = 4 
        int x; 
    }; 
  
    printf("Size of struct: %ld", sizeof(struct C)); 
  
    return 0; 
} 

输出:

Size of struct: 16

对齐:
在这里插入图片描述

指针与数组

int strlen(char *string);
int strlen(char string[]);
这两个声明完全相等,string都被用作指针来处理,也只有在这种上下文场景中才相等.
其他的情况下,数组名是常量.

看下面的例子:

#include <stdio.h> 

void printfc(char a[])
{
    
    while (*a != '\0')
    {
        printf("%c  ", *a);
        a ++; // 此处a是指针可以自增
    }
    printf("\n");

    return ;
}
  
int main() 
{ 

    char a[] = "Hello World!";

    printfc(a);
  
    return 0; 
} 

输出:

H e l l o   W o r l d !
#include <stdio.h> 

  
int main() 
{ 

    char a[] = "Hello World!";

    while (*a != '\0')
    {
        printf("%c ", *a);
        a ++; // 此处错误,数组名a是常量,无法进行自增运算
    }
    printf("\n");
  
    return 0; 
} 
一、C语言自我YY 1)、C语言是许多高级计算机语言的基础,学好C语言能更好的学习其他高级语言,为以后的学习打基础;往深学C语言的话那就是学到C在Linux里的应用,Linux十分强大。 2)、C语言是一种计算机程序设计语言。具有高级语言的特点,又具有汇编语言的特点。C语言可作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。 3)、应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。具体应用比如单片机以及嵌入式系统开发。 4)、C语言是面向过程语言C语言通过windows/linux平台下编译的,是直接运行在windows/linux平台下的,而XX始终是运行在他的虚拟机之上的;所以理论上C语言能做一些相对于比较底层的工作,像XX就不能编写Windows病毒。 5)、如果要利用编程来做一些windows优化工作的话,建议还是利用C语言C语言是目前世界上流行、使用最广泛的高级程序设计语言 6、很多编译器,几乎所有操作系统Windows,Linux,Unix的大部分代码都是CC在背后做了很多东西的,也许开发游戏用C++,安卓用XX更为合适,图形界面的用其他语言开发效率更高一些(因为他们封装了很多东西),但同样的原因导致略微接近底层的功能其他语言根本干不了!Windows的API都是按照C语言的格式给的,这也很能说明问题!嵌入式开发更是离不了C语言!纵观电脑发展几十年,C语无所不能呀!
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页