美文网首页
针对C语言疑惑解答

针对C语言疑惑解答

作者: 一个冬季 | 来源:发表于2017-11-07 16:17 被阅读32次

疑惑内容如下:

  • 指针也是一种变量
  • *操作符的含义
  • 指针变量和它所指向的内存块是二个不同的概念
  • *p 含义
  • getchar()操作符
  • gets和getchar的区别
  • strlen
  • strcmp比较符
  • c语言中声明和定义的区别
  • unsigned/signed的解释
  1. 指针也是一种变量,占有内存空间,用来保存内存地址

  2. 操作符的含义(下文拿p举例)
    在指针申明时, *号所申明的变量为指针
    在指针使用时, *号表示操作指针所指向内存空间的值
    *p相当于通过地址(p变量的值)找到一块内存;然后操作内存
    *p放在等号的左边,给p所指向的内存赋值
    *p放在等号的右边,通过p里面的内存地址,找到对应的变量,然后取值

  3. 指针变量和它所指向的内存块是二个不同的概念
    定义一个指针变量p
    ①在给p赋值时,只会改变p所指向的内存地址(指针变量的值),并没有改变p所指向的内容(内存块的值)
    ②给
    p赋值*p='a'; 不会改变p所指的内存地址(指针变量的值),只会改变所指的内存块的值 。
    接下来看看间接赋值的理解:
    int *p=NULL(int *p,p=NULL);//定义一个指针变量p,他的地址为0;
    int a=10;
    p=&a;//把a的内存地址赋给p;
    *p=20;//改变p所指的内存块的值,也就是改变了a的值

  4. p 含义 :这是一个指针,他也是一个变量,他特殊在,p只能存地址,所以平时我们更改p变量的值,同时就更改了p所指向的内存,当加入花的时候,表示我要去操作或者说我要去访问这个内存地址了

  5. getchar()操作符的解释说明

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    int i, j, k;
    char str[5];
    for (i = 0; i < 5; i++) {
        str[i] = getchar();//当程序调用到这里的时候,   程序就等待用户的输入,如果用户输入的
        //不止一个字符,那么就会存入键盘的缓冲去中,当用户点击回车的时候,程序会自动从
        //缓冲区中一个,一个字符的读取
//程序会在getchar这里一直等待用户回车,不回车,不会继续执行下一步
    }

    for (i = 0, j = 4; i < j; i++,j--) {
        k = str[i];
        str[i] = str[j];
        str[j] = k;
    }

    for (i = 0; i < 5; i++) {
        printf("%c", str[i]);
    }
    system("pause");
    return 0;
}

getchar();//当程序调用到这里的时候, 程序就等待用户的输入,如果用户输入的,
不止一个字符,那么就会存入键盘的缓冲去中,当用户点击回车的时候,程序会自动从缓冲区中一个,一个字符的读取

  1. gets和getchar的区别:
    gets(字符数组):
char str[20]
gets(str);

getchar:获取输入的单个字符

  1. strlen 获取字符串的长度,不包括'\0';

  2. strcmp比较符

    char *a = "aBcDeF";
    char *b = "AbCdEf";
    char *c = "aacdef";
    char *d = "aBcDeF";
    printf("strcmp(a, b) : %d\n", strcmp(a, b)); 
    printf("strcmp(a, c) : %d\n", strcmp(a, c));
    printf("strcmp(a, d) : %d\n", strcmp(a, d));

输出结果:
strcmp(a, b) : 32
strcmp(a, c) :-31
strcmp(a, d) : 0
虽然给的是字符串,但是比较的时候,是一个一个比较的时候,只要其中一个比较出了大小,就已经可以做出判断了。上面的小a(97) 和大A(65) 所以 a>b

  1. c语言中声明和定义的区别
    最根本区别:不需要开辟内存空间的是声明,需要开辟内存空间的是定义;
extern int b;//我们可以明确的确定它是申明,因为有extern标签
int main( )
{
    int a;//我们可以说它是申明,也可以说它是定义
}

通过上面的代码我们可以得出下面结论,如果没有开辟内存空间就是申明,开辟了内存空间就是定义,我们再看下面的一种形式

int main( )
{
    extern int a; //这是声明不是定义。声明a是一个已定义的外部变量
}
int a;  // 是定义,定义a为整型外部变量

这里相同的变量处于同一个.c文件里面,有一个地方对变量a申明了,我们再次去int a 那么这个a就是定义,申明可以有很多次,但是定义只能有一次,如果相同的变量处于同一个.c文件里面,再次去形如int a 这样去使用它,那就是定义了

  1. unsigned/signed的解释
    平常我们定义一个int a 是带有符号的signed(默认在使用的时候隐藏),它的取值范围是-32768 到 +32767的整数
    我们无符号的unsigned取值范围是 0到 65535。
    在此解释之前,我们需要了解下基础知识,看看我们平时存储的数字在计算机中怎么存储的,我拿16-bit 计算机为例子:
    int singed a = 1 的存储方式如下;


    singed.png

上面表格中最左端的为最高位,最右端的为最低位,signed类型的整数,要去除最高位(符号位),剩下的15位来进行编码的,而最高位只是用来做标记的,标记的是整数的正负,0表示正,1表示负。
那么我们去除最高位后(符号标记位),负数取值范围是:-2^15, 正数的取值范围是:2^15 -1。

针对有符号位的整形 int a = -1 是怎样存储在计算机里面的?
存储方式:原码---->反码---->补码
原码图


原码.png

反码图=原码图全部数字取反


反码.png

补码图=反码图最后一位数字+1


补码.png

以上就是我们数字在计算机里面的存储的方式了。

对于unsigned的整数,是没有符号位的,所以其16位全部用来编码(没有符号位了),取值范围就是从0开始了,0到2^16。
总结下:
signed的取值范围是从-2^15 到 2^15-1,为啥是15次方呢?因为singed是需要有符号位的,我们计算的时候,需要去除掉最高位符号位。
unsigned的取值范围是0 到 2^16-1 ,所以整的来说,在正数上面unsigned的取值范围大于signed

未完待续。。。。

相关文章

  • 针对C语言疑惑解答

    疑惑内容如下: 指针也是一种变量 *操作符的含义 指针变量和它所指向的内存块是二个不同的概念 *p 含义 getc...

  • block原理

    c语言中的闭包 block解答题 block结构 唐巧之谈Objective-C block的实现

  • 疑惑和解答

    生活中肯定有很多这样的时刻 你坚持做对的事情 但是身边几乎所有人都是和你做相反的举措 这时候你就难免要怀疑自己做得...

  • 疑惑与解答

    澄清了对哲学的误解后,想要了解更多,结果看了很多解释和分析后,不由得开始怀疑,当前所选的路是否正确呢?从单纯的描述...

  • 零基础学习C语言如何入门(内附工具书推荐+视频教程)

    C语言同C++、Python等都是通用性的编程语言,它们不针对某一个特定的方向,能做的事情很多。C语言主要用于底层...

  • 零基础学习C语言如何入门(内附工具书推荐+视频教程)

    C语言同C++、Python等都是通用性的编程语言,它们不针对某一个特定的方向,能做的事情很多。C语言主要用于底层...

  • Objective-C中@property和@synthesiz

    在Objective-C中,@是Objective-C的标志,证明您正在使用Objective-C语言! 针对Ob...

  • 对象&原型疑惑解答

    问题1: OOP 指什么?有哪些特性 面向对象编程(Object Oriented Programming,缩写为...

  • 爸妈学堂疑惑解答

    第一讲教育解密10.28 问题一:老师,我女儿今年8岁了,喜欢我们夸奖他,不喜欢被批评,每当我们批评她或者当着她的...

  • 解答学妹疑惑(二)

    问题:我现在还有部分不太开心的是,我们分园高开低走了,换了一波领导,现在幼儿园的教育理念和水平我觉得跟别家拉不开差...

网友评论

      本文标题:针对C语言疑惑解答

      本文链接:https://www.haomeiwen.com/subject/wksjmxtx.html