0%

C语言 数据运算符

C语言的数据运算符

这一节接触的都是新东西,hold住。

数据运算符顾名思义就是对数据进行操作的运算符,这里设计到几个新概念,如果刚开始不了解,也没有关系,毕竟是进阶的东西,先大概看一下有个基础概念,因为这一次我们接触到了C语言中最难懂也是最优雅的指针,此处有掌声。

​ 数据运算符有下面几个:

数据运算符 含义
sizeof() 获取xx的大小,返回字节长度
[] 数组
& 取地址
* 定义指针或者解指针
-> 结构体解应用
. 结构体应用

详细说说这几个的具体含义:

  • sizeof(xx):这个比较简单,就是计算xx的字节长度;
  • []:数组的定义方式,比如int a[10]就是定义了一个一维的整数数组,这个数组长度为10,但是有个问题要注意了,数组的长度从0开始,所以如果访问数组a,只能是a[0]到a[9],如果下标是10就越界报错了,其实ANSI也曾尝试着把这个下标从1开始矫正过来,但是几十年的传统还有兼容性,此事只能作罢;
  • &:取地址是取一个变量的地址,比如int a=0;我们顶一个了一个整数a,它的值是0,那么它位于哪里呢,这个就类似于你叫张三,你家的地址在桃花坞里桃花庵,桃花庵里第一间,另注意这个符号在C++里面是引用的含义,不要混淆;
  • *:这个星号就大有来头了,前后左右的含义不一样,古往今来也很很多人栽进去了,就是因为这个隐晦又高效的指针,所以有了一本书叫做《C和指针》,专门来讲讲这个东西,后面我们也会 有系列小篇,争取能让大家越过这个坎,那就算是C语言里面的高手了;
  • ->和.:这两个的区别主要在于结构体,如果定义的结构体是指针用->,如果不是用.,这个我也迷惑过。

看个例子来show一下:

这个例子又新增了一些东西,除了上面描述的运算符,我们增加了一个头文件string.h,这个用来后面调用strcpy函数,另外还使用了结构体,下一节来聊聊必须要使用的结构体。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*advance/operator/operator3.c*/
#include <stdio.h>
#include <string.h>

int main()
{
int a;
printf("sizeof(a) is %d \n", sizeof(a));

int arr[100];
arr[0] = 0;
arr[2] = 2;

printf("The value of arr[0] is %d\n", arr[0]);
printf("The value of arr[1] is %d\n", arr[1]);
printf("The value of arr[2] is %d\n", arr[2]);

printf("The address of a is %X\n", &a);
printf("The address of arr is %X\n", arr);

int *pa = &a;
printf("The address of a is %X\n", pa);
int *parr = arr;
printf("The address of arr is %X\n", parr);

struct person
{
char name[20];
int age;
};

struct person lilei = {"Li Lei", 18};
printf("Person 1 : Name: %s\t Age : %d\n", lilei.name, lilei.age);

struct person hanmeimei;
struct person *phanmeimei = NULL;
phanmeimei = &hanmeimei;
strcpy(phanmeimei->name, "Han Meimei");
phanmeimei->age = 16;
printf("Person 2 : Name: %s\t Age : %d\n", phanmeimei->name, phanmeimei->age);
return 0;
}

相应地Makefile如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#advance/operator/Makefile

ALL : operator1 operator2 operator3

operator1: operator1.c
gcc -o operator1 operator1.c

operator2: operator2.c
gcc -o operator2 operator2.c

operator3: operator3.c
gcc -o operator3 operator3.c

.PHONY : clean

clean:
rm -f operator1 operator2 operator3

输入make,然后./operator3输出为:

1
2
3
4
5
6
7
8
9
10
sizeof(a) is 4
The value of arr[0] is 0
The value of arr[1] is 0
The value of arr[2] is 2
The address of a is EDFAD6D8
The address of arr is EDFAD710
The address of a is EDFAD6D8
The address of arr is EDFAD710
Person 1 : Name: Li Lei Age : 18
Person 2 : Name: Han Meimei Age : 16

Q&A :上上节的答案,为什么a没有赋值却有这么大的值,这个涉及到后面会说到的全局变量和局部变量的区别,局部变量在未初始化之前,有可能是任何值,所以为防意外,变量定义最好都要初始化。

处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道