一、C语言指针学习架构

1.基本数据类型---指针

2.字符串---指针

3.数组---指针

4.函数---指针

5.结构体---指针

6.共用体---指针

7.枚举---指针

8.位域---指针

9,常量---指针

10.变量---指针

二、C语言中的void与NULL

//void真正发挥的作用在于:
//(1) 对函数返回的限定;
//(2) 对函数参数的限定
//  (3)void不能代表一个真实的变量, 凡是试图用它去表示真值得做法都是不合法的
//void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。
//正如不能给抽象基类定义一个实例,我们也不能定义一个void(让我们类比的称void为“抽象数据类型”)变量。

#include<stdio.h>
#include<string.h>
#define ARRSIZE 87
int main()
{
    int a = 8;
    void *pVoid = a;  //定义一个void变量没有意义
    int *pInt;
    pVoid = pInt; //void *可以指向任何类型的数据,“无类型”可以包容“有类型”
    //pInt = pVoid, xxx,而“有类型”则不能包容“无类型”

//如果函数的参数可以是任意类型指针,那么应声明其参数为void *
    //典型的如内存操作函数memcpy和memset的函数原型分别为:
    //void * memcpy(void *dest, const void *src, size_tlen);
    //void * memset ( void * buffer, int c, size_t num );

//这样,任何类型的指针都可以传入memcpy和memset中,memcpy和memset函数返回的也是void *类型.这也真实地体现了内存操作函数的意义
    //因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型,这样的memcpy和memset明显不是一个“纯粹的,脱离低级趣味的全能的”函数!

int intArray1[ARRSIZE] = {1, 2, 3};
    int intArray2[ARRSIZE] = {4, 5, 6};
    memset(intArray1, 0, ARRSIZE*sizeof(int));
    printf("intArray1[2] = %d\n", intArray1[2]);
    memcpy(intArray2, intArray1, ARRSIZE*sizeof(int));
    printf("intArra2[2] = %d\n", intArray2[2]);
    
    float intArray3[ARRSIZE] = {1,23, 2,64, 3,89};
    float intArray4[ARRSIZE] = {4.3, 5.7, 6.9};
    memset(intArray3, 0, ARRSIZE*sizeof(int));
    printf("intArray3[2] = %f\n", intArray3[2]);
    memcpy(intArray4, intArray3, ARRSIZE*sizeof(int));
    printf("intArray4[2] = %f\n", intArray4[2]);
    
    //对于指针如果暂时没有合适的初始化值,就应该把它置为NULL(0)。
    int *p = NULL;
    printf("&p = %p\n",  &p);  //逻辑地址为0x00000000,不可访问,会出现段错误,只适用于指针初始化未能赋值时使用。

printf("pVoid = %d, &pVoid = %p; pInt = %d, &pInt = %p\n",  pVoid, &pVoid, pInt, &pInt);
    (char *)pVoid++;  //ANSI, GNU,ALL RIGHT!
   printf("pVoid = %d, &pVoid = %p; pInt = %d, &pInt = %p\n",  pVoid, &pVoid, pInt, &pInt);
    
    return 0;
}

#include<stdio.h>
int main()
{
    int *p = NULL;
    printf("&p = %p\n", &p);  //输出地址是随机的
    return 0;
}

三、C语言常量大全

//--常量--const--只读--:数值不发生改变的数据
//常量最多有3个属性--代号/地址/本身值
#include<stdio.h>

int main()
{
    //一、字符常量
    'r'
    '5'
    ' '
    '\n'
    '\0'
    '\777'  //1~3位八进制
    '\xef'  //1~2位十六进制
    
    //二、整型常量
    10

//三、浮点型常量
    3.14

//四、枚举常量
    enum WEEKDAY
    {
        MON = 1,
        TUE,
        WED,
        THU,
        FRI,
        STA,
        SUN
    };

//五、常量与指针
    //1,指针常量
    int a = 1;
    int *const b = &a; 
    //const 修饰 b, b-->只读,但*b未被修饰故可读可写.
    //const位于*右侧,表明对象是常量,内容为指针(地址)
    //声明常量b,它的值是变量a的地址
    *b = 20;
    printf("b = %p, *b = %d\n", b, *b);
    //2,常量指针
    int c = 39;
    const int *d = &c; 
    // const 修饰的是*d,*d-->只读,但d未被修饰故可读可写
    d = b;
    printf("d = %p, *d = %d\n", d, *d);
    //int strcmp(const char *str1, const char *str2);
    //因为函数的参数声明用了常量指针的形式,就保证了在函数内部,
    //那个常量不被更改。
    //也就是说,对str1和str2的内容更改的操作在函数内部是不被允许的
    //但是可以对他们的地址进行操作(间接的对他们进行(整体的操作))
    //3,指针常量的指针常量
    const int * const e = &a;  //此时e或者*e均为常量,e,*e-->只读

//六、常量与字符串(字符数组)
    char* ptr1 = "abc";  //"abc" 是常量
    //因为定义的是一个普通指针,并没有定义空间来存放"abc",
    //所以编译器得帮我们找地方来放"abc",
    //显然,把这里的"abc"当成常量并把它放到程序的常量区是编译器最合适的选择     //所以尽管ptr的类型不是const char*,
    //并且ptr[0] = 'x';也能编译通过,
    //!!!但是执行ptr[0] = 'x';就会发生运行时异常,
    //因为这个语句试图去修改程序常量区中的东西。
    //这种写法原来在c++标准中是不允许的,
    //但是因为这种写法在c中实在是太多了,
    //为了兼容c,不允许也得允许。虽然允许,
    //但是建议的写法应该是
    const char* ptr = "abc";
    //这样如果后面写ptr[0] = 'x'的话编译器就不会让它编译通过,
    //也就避免了上面说的运行时异常。
    //如果char* ptr = "abc";写在函数体内,那么虽然这里的"abc\0"被
    //放在常量区中,但是ptr本身只是一个普通的指针变量,
    //所以ptr是被放在栈上的, 只不过是它所指向的东西被放在常量区罢了
    //字符串常量的类型可以理解为相应字符常量数组的类型,
    // 如"abcdef"的类型就可以看成是const char[7]""
    char *str = "This is a special string";
    char string[ ]="This is a string";
    //字符指针str与字符数组string的区别是:
    //str是变量,可改变str使它指向不同的字符串,但不能改变str所指的字符串常量
    //string是一个数组,可以改变数组中保存的内容。
    //字符串本身就可以代表他们的地址

//七、字符数组与函数数组传参
    char str[] = "abcdef";  //就有sizeof(str) == 7,因为str的类型是char[7],
    sizeof("abcdef") == 7;  //因为"abcdef"的类型是const char[7]。
    char *ptr = "abcdef";  //就有sizeof(ptr) == 4,因为ptr的类型是char*。
    char str2[10] = "abcdef";  //就有sizeof(str2) == 10,str2的类型是char[10]
    void func(char sa[100],int ia[20],char *p)
    // 就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4;
    // 因为sa的类型是char*,ia的类型是int*,p的类型是char*

return 0;   
}
---------------------

四、C语言变量总结

//--变量--可写--:数值可发生改变可被覆盖
//变量一般有4个属性:可写/代号/地址/本身值
#include<stdio.h>

int main()
{
    //一、字符,整型,浮点型变量
    char a = 'a';
    int b = 3;
    float c = 3.141592653;
    
    //二、指针变量
    //三、数组变量
    //四、结构体变量
    //五、函数变量

return 0;
}
---------------------

C语言若干知识点归记的更多相关文章

  1. C/C++编程笔记:C语言入门知识点(三),请收藏C语言最全笔记!

    今天我们继续来学习C语言的入门知识点,第一课:C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记! 21. 输入 & 输出 当我们提到输入时,这意味着要向程序填充一些数据.输入可 ...

  2. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  3. JavaScript语言基础知识点图示(转)

    一位牛人归纳的JavaScript 语言基础知识点图示. 1.JavaScript 数据类型 2.JavaScript 变量 3.Javascript 运算符 4.JavaScript 数组 5.Ja ...

  4. JavaScript 语言基础知识点总结

    网上找到的一份JavaScript 语言基础知识点总结,还不错,挺全面的. (来自:http://t.cn/zjbXMmi @刘巍峰 分享 )  

  5. JavaScript语言基础知识点图示

    原文:JavaScript语言基础知识点图示 一位牛人归纳的JavaScript 语言基础知识点图示. 1.JavaScript 数据类型 2.JavaScript 变量 3.Javascript 运 ...

  6. Elementui实战知识点随记

    1. Elementui实战知识点随记 1.1. 表单验证 对于复杂数据,类似于对象里面包含数组,每个数组又包含多个对象,表单验证我查看了网上很多资料都说Elementui不支持,实际上,经过我官网的 ...

  7. 关于c语言的知识点不足的地方

    在最近的一次c语言考试之前,自己根据老师说的会出原题的卷子的总结 关于代码的自动对齐,dev c++ CTRL+shift+A/a 关于运算顺序的csdn上有,常考的有/ %等 上地址 https:/ ...

  8. c语言小知识点

    大一时学c语言,总结的一些自己感觉很零碎且容易忘的知识点,不对之处请指正 1.字符串不管中间是否有数值0,结尾一定有数值02.浮点类型的变量存储并不精确3.printf格式串自动右对齐,加负号左对齐4 ...

  9. lua语言自学知识点----Lua与.Net相互调用

    知识点: LuaInterface作用是用来完成Lua与C#的相互调用. LuaInterface核心库:1.luainterface.dll 用于C#读取lua(放在bin目录同级) 2.luane ...

随机推荐

  1. 使用SimHash进行海量文本去重

    阅读目录 1. SimHash与传统hash函数的区别 2. SimHash算法思想 3. SimHash流程实现 4. SimHash签名距离计算 5. SimHash存储和索引 6. SimHas ...

  2. java 线程安全集合

    ConcurrentMap 线程安全的HashMap CopyOnWriteArrayList 读多写少的线程安全的ArrayList,性能比vector好. ConcurrentLinkedQueu ...

  3. putty(winscp)无法连接到linux(ubuntu)

    为了能在自己笔记本电脑上兼容公司的用64位系统编译出来的MapReduce程序,我把自己原来32位的ubuntu虚拟机删除后,安装了目前最新的ubuntu-14.04.2-desktop-amd64. ...

  4. 【恢复,1】 redo 日志恢复的各种情况

    Recovering After the Loss of Online Redo Log Files If a media failure has affected the online redo l ...

  5. (一)struts2入门——登陆验证熟悉struts2部署

    0.了解 Struts(支柱.支干)是什么? Struts是流行和成熟的基于MVC设计模式的Web应用程序框架.使用它能帮助我们减少在运用MVC设计模型来开发Web应用时间. 为什么2.1.3之后用S ...

  6. 编码gbk ajax的提交

    客户端

  7. Ubuntu 14.04安装配置NFS

    (一)安装NFS服务器 sudo apt-get install nfs-kernel-server sudo apt-get install nfs-common​(在安装nsf-kernel-se ...

  8. 转mosquitto auth plugin 编译配置

    配置使用 mysql 作为 be (back end) 使用config.mk 配置编译参数 cp config.mk.in config.mk 修改 安装 mysql sudo apt-get in ...

  9. appium 1.6.3 + ios 10.2 + xcode 8.2.1 真机运行safari

    启动appium 命令: appium --address "127.0.0.1" --session-override --pre-launch --debug-log-spac ...

  10. 使用URLConnection下载文件或图片并保存到本地

    有时候需要从网络上面下载图片到本地进行保存,代码如下: package com.jointsky.jointframe.test; import java.io.FileOutputStream; i ...