重学c语言之查漏补缺一 数据类型

  学习编程的过程中深感基础的重要性,为此重新梳理一遍c语言的基础,查漏补缺。

1.数据类型

  数据类型决定了数据的取值范围,存储空间大小以及运算的方式。在我们声明一个变量时,前面一般需要带上数据类型
  在初次学习时,我只能理解基本类型的使用与意义,而现阶段需注意其它数据类型的使用方式,换句话说,除了常见的基本数据类型变量的声明,也要习惯常见的构造类型以及指针类型变量的声明。
  如下图:
在这里插入图片描述
这里需要注意的是字符和字符串的一些概念辨析:
  字符串:是由数字、字母、下划线等等组成的一串字符
  字符串常量:以双引号引起来的数据。
  字符常量:以单引号引来的一个字符,在计算机中一个字符占一个字节,其数值为字符的ASCII值。
  字符串可改变,而字符串常量不能改变,后文会细谈。

1.1关于char

  c语言中基本数据类型中只有字符型(char),描述的是单个字符(一个字节),一个中文符号占两个字节,没有严格的字符串类型,而是用字符数组来存放字符串。c++和java中有专门的string这个类来存放字符串。

1.2 typedef重定义类型

  用typedef重定义类型,在结构体中很常用,作用为简化声明或明确意义,基本语法:
typedef 已有类型名 新类型名
  关于typedef和define与const的区别,再写。

2.常量与变量

  关于常量和变量的理解容易进入误区,虽然二至仅一字之差,但注意:常量是数据,代表一个常数,而变量是存放数据的容器。即:变量是用来存放常量的一个量。

2.1 常量

  顾名思义,常量是指在程序运行过程中其值不发生变化的量,用const 关键字。因为其一旦被创建就无法修改,所以必须在声明/定义的同时赋值。且常量名字一般为大写。
常量的分类如下图:
在这里插入图片描述
其中需要注意的就是字符常量和字符串常量的引号区别。
  形式上:字符常量: 单引号;字符串常量: 双引号,
  内容上:字符常量相当于整数(文后面有介绍);字符串常量类似数组名,相当于一个首地址。
  占内存大小:字符常量 : 一个字节;字符串常量: 至少有个“\0”;
如下所示:

2.2变量
2.21变量声明

  从变量的声明赋值可以看出,变量有3个重要的属性,即数据类型,变量名和变量值。这里,变量名和内存单元地址存在一一对应的关系,可类比于人的名字和身份证号。
  在使用变量时需要事先声明/定义,向操作系统申请一块内存空间,便于编译时为变量值事先分配空间和进行语法检查。
  =,即赋值运算符,将数据放到一块内存里,这块内存的名字,即为变量名,同时,这块内存也有地址。

2.22. 有关指针变量的声明

  在定义指针变量时,格式为

类型名  *指针变量名

这里需要注意的是这里的类型名,指的是所指向的地址中存放的变量的类型,形如 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类型参数的函数。

2.22变量初始化

另外,注意声明变量后记得初始化变量。原因在于,在变量声明后,操作系统为其分配一块内存,但不会将这块内存“打扫“。换言之,这块内存之前可能就存在垃圾数据,建议声明后初始化。
对基本数据类型的变量的初始化,一般赋值”0“,如下:

int a=0;
char cc=0;

注意,对字符串变量的初始化,采用的是memset()函数,本质上也是全赋值"0"。

char name[20];
memset(name, 0 , sizeof(name));

这个知识点在网络编程中发送数据时,会事先定义一个缓冲区,也就是一个字符串变量,然后会用memset()函数初始化以后再使用。

2.23变量

3.关于字符和字符串

char类型的变量存储的时字符的ASCII码,我们知道a对应的ASCII码为97,因此可参考下列程序:

#include<stdio.h>
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<stdio.h>
#include<string.h>
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 <stdio.h>

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;
}

运行结果如下:
在这里插入图片描述

需要明白数组名和首元素地址的关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信仿真爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值