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 #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 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 is 0 The value of arr is 0 The value of arr 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 : 18Person 2 : Name: Han Meimei Age : 16
Q&A :上上节的答案,为什么a没有赋值却有这么大的值,这个涉及到后面会说到的全局变量和局部变量的区别,局部变量在未初始化之前,有可能是任何值,所以为防意外,变量定义最好都要初始化。