学习编程的过程中深感基础的重要性,为此重新梳理一遍c语言的基础,查漏补缺。
数据类型决定了数据的取值范围,存储空间大小以及运算的方式。在我们声明一个变量时,前面一般需要带上数据类型。
在初次学习时,我只能理解基本类型的使用与意义,而现阶段需注意其它数据类型的使用方式,换句话说,除了常见的基本数据类型变量的声明,也要习惯常见的构造类型以及指针类型变量的声明。
如下图:
这里需要注意的是字符和字符串的一些概念辨析:
字符串:是由数字、字母、下划线等等组成的一串字符
字符串常量:以双引号引起来的数据。
字符常量:以单引号引来的一个字符,在计算机中一个字符占一个字节,其数值为字符的ASCII值。
字符串可改变,而字符串常量不能改变,后文会细谈。
c语言中基本数据类型中只有字符型(char),描述的是单个字符(一个字节),一个中文符号占两个字节,没有严格的字符串类型,而是用字符数组来存放字符串。c++和java中有专门的string这个类来存放字符串。
用typedef重定义类型,在结构体中很常用,作用为简化声明或明确意义,基本语法:
typedef 已有类型名 新类型名
关于typedef和define与const的区别,再写。
关于常量和变量的理解容易进入误区,虽然二至仅一字之差,但注意:常量是数据,代表一个常数,而变量是存放数据的容器。即:变量是用来存放常量的一个量。
顾名思义,常量是指在程序运行过程中其值不发生变化的量,用const 关键字。因为其一旦被创建就无法修改,所以必须在声明/定义的同时赋值。且常量名字一般为大写。
常量的分类如下图:
其中需要注意的就是字符常量和字符串常量的引号区别。
形式上:字符常量: 单引号;字符串常量: 双引号,
内容上:字符常量相当于整数(文后面有介绍);字符串常量类似数组名,相当于一个首地址。
占内存大小:字符常量 : 一个字节;字符串常量: 至少有个“\0”;
如下所示:
从变量的声明赋值可以看出,变量有3个重要的属性,即数据类型,变量名和变量值。这里,变量名和内存单元地址存在一一对应的关系,可类比于人的名字和身份证号。
在使用变量时需要事先声明/定义,向操作系统申请一块内存空间,便于编译时为变量值事先分配空间和进行语法检查。
=,即赋值运算符,将数据放到一块内存里,这块内存的名字,即为变量名,同时,这块内存也有地址。
在定义指针变量时,格式为
类型名 *指针变量名
这里需要注意的是这里的类型名,指的是所指向的地址中存放的变量的类型,形如 int *p
,表明了这个指针p所指向的只能是int类型的变量。
指针函数
顾名思义是一个返回值为指针的函数,声明格式为:*类型标识符 函数名(参数)。如下所示例子
int *fun(int x , int y);
类比int *p,就比较容易理解这一块。对int *p,指针变量名为p,定义了一个指针变量。 而这里,fun这个函数相当于p这个变量名,相当于定义了一个函数,其返回值为一个指向int的指针。
函数指针
函数指针,顾名思义是一个指向该函数的指针变量。即指向函数的指针,声明格式为:类型说明符 (*指针变量名)(参数)
int fun(int x, int y); //声明一个函数
int (*p)(int x , int y); //定义一个函数指针
p=fun; //将p指向fun函数的首地址
首先它是一个指针变量,所以要有一个*,即(*p),其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。合起来意思就是:定义了一个指针变量p,可以指向:返回值为int,且有两个int类型参数的函数。
另外,注意声明变量后记得初始化变量。原因在于,在变量声明后,操作系统为其分配一块内存,但不会将这块内存“打扫“。换言之,这块内存之前可能就存在垃圾数据,建议声明后初始化。
对基本数据类型的变量的初始化,一般赋值”0“,如下:
int a=0;
char cc=0;
注意,对字符串变量的初始化,采用的是memset()函数,本质上也是全赋值"0"。
char name[20];
memset(name, 0 , sizeof(name));
这个知识点在网络编程中发送数据时,会事先定义一个缓冲区,也就是一个字符串变量,然后会用memset()函数初始化以后再使用。
char类型的变量存储的时字符的ASCII码,我们知道a对应的ASCII码为97,因此可参考下列程序:
#include
int main()
{
char ch = 'a';
printf("%c\n",ch);
printf("%d\n",ch);
int ch_int =97;
printf("%c\n",ch_int);
return 0;
}
输出结果:a , 97 , a
也就是说,当一个整数在0-255范围(可参见ASCII码表)内,也可以用字符形式输出,同样,一个字符也可以用整数形式输出。换言之,字符肯定是整数,0-255范围内整数肯定是字符。
关于字符串常量和字符串变量:
严格来说,c语言没有字符串变量,而是使用字符数组来存放字符串。例如:
char a[20];
注意在c语言中,只有在定义字符数组的时候才能用“=”来初始化变量,其它情况下是不能直接用“=”来为字符数组赋值,而是用strcpy函数,定义在头文件string.h中。
如下例子:
#include
#include
int main()
{
char a[20] = "12"; //正确,声明同时用=赋值
printf("%s\n",a);
char b[20];
//b = "1234"; //错误
strcpy(b,"1234"); //正确
printf("%s\n",b);
return 0;
}
c语言中关于字符串的一些操作比较特殊:
参考博客:C语言中字符数组和字符串指针分析
#include
int main(int argc, char *argv[])
{
char day[15] = "abcdefghijklmn";
char* strTmp = "opqrstuvwxyz";
printf("&day is %x\n",&day);
printf("&day[0] is %x\n",&day[0]);
printf("day is %x\n",day);
printf("\n&strTmp is %x\n",&strTmp);
printf("&strTmp[0] is %x\n",&strTmp[0]);
printf("strTmp is %x\n",strTmp);
getchar();
return 0;
}
需要明白数组名和首元素地址的关系