声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4256061.html

初始化

在不进行显示初始化时,外部变量与静态变量都将被初始化为0,而自动变量和寄存器变量的初值则没有定义。
 
对于外部变量与静态变量来说,初始化表达式必须是常量表达式,且只初始化一次(在程序开始执行前进行初始化)。对于自动变量与寄存器变量,则在每次进行函数或程序块时都将被初始化。
 
在定义数组时,可以指定数组大小的同时又初始化内容,也可只指定元素内容,则不指定大小,这时数组的大小是初始化元素的个数。
 
在既指定大小又指定内容时,指定的大小可以大于初始化元素个数,没有初始化的元素的内容为随机数。但指定的大小不能小于后面初始化的元素的个数,否则编译时会有警告,并且即使初始化了超过指定大小的元素内容,访问时得到的也是随机值。
 
如果初始化元素个数比指定的数组大小小时(但一定要初始化,那怕初始化时没有内容,只声明不初始时元素的值还是一个随机值),则没有初始化的表达式元素将被初始化为0,如:
    int a[4] ={};//每个元素的值为0
    int b[4]={1};//除第一个元素外,其他三个元素的值都是0
    int c[4];//所有元素都是随机值
 
字符数组的初始化有以下同人种方式:
    char str[] = "string";
    char str[] = { 's', 't', 'r', 'i', 'n', 'g', '\0' };

指针

指针是把其他变量地址作为其值的变量。、NULL或某个地址。具有值等价于把它初始化为NULL。赋值给指针时,编译器先把转换为指向合适数据类型的指针是唯一能够直接赋给指针变量的整数值
 
    int y;
    int * yPtr;
    y = 7;
    yPtr = &y;
    printf("%p %p\n\n", &y, yPtr);//0022FF4C 0022FF4C
    printf("%d %d\n\n", y, *yPtr);//7 7
    printf("%p %p %p\n\n",&yPtr, &*yPtr, *&yPtr);//0022FF48 0022FF4C 0022FF4C 

 
地址运算&的操作数必须是一个变量,不能把地址运算符用于常量、表达式或存储类别被声明为register的变量上。
 
引用没有被正确初始化或没有指向具体的内存单元都会导致致命执行错误或意外地修改重要的数据。
 
个整型元素的一维数组(个整型为单位进行移动,可以将个元素,其中每个元素都有一个指向某个整型变量的指针(数组变量本身是指向首元素,个整型为单位进行移动,
    int a[][3] = { { 11, 12 }, { 21, 22, 23 } };
    //可以有以下四种方式访问a[1][0]元素,方括号[]比*优
    //先级高,所以下面是可以省略的
    printf("1、%d\n", a[1][0]);//21
    printf("2、%d\n", *((a + 1)[0]));//21
    printf("3、%d\n", *(a[1]));//21
    printf("4、%d\n", **(a + 1));//21
 
    //在定义时可以不指定指针移动的单位,即指针单位长度
    //但如果不指定,则不能对指针进行移动操作,否则编译出错
    int (*p1)[] = a;
    //在不移动指针的条件下可以访问第一个元素
    printf("5、%d\n", **p1);//11
    //编译不能通过,因为上面在定义p1时未指定指针的最小移动单位
    //所以不能移动
    //  printf("%d", **(p1 + 1));
 
    //一维数组指针
    int b[]={1,2,3};
    int *pb=b;
    printf("6、%d\n", *(pb + 1));//2
 
    //指定长度后就可以对指针进行移动
    int (*p2)[3] = a;
    //以3个int为单位进行移动
    printf("7、%d\n", **(p2 + 1));//21
 
    //编译时警告。以2个int单位进行移动
    int (*p3)[2] = a;
    printf("8、%d\n", **(p3 + 1));//0
 
列的某个整型数组,3是指该指针移动的基本单位是3格,至于每格多少位要看声明时类型,这里是int,所以指针在向前或向后移动时是以3个整型为单位移动。
 
,再取第二个字符串,最后取第二个串中的第一个字符
    printf("%c\n", (*++a)[0]);//c
    //取第二个字符串中的第2个字符:a[0]为第二个字符串地址,++a[0]第二个字符串首地址下移,*++a[0]取出相应地址中的字符
    printf("%c\n", *++a[0]);//e
    //指针a再次向下移动一个单元,此时指向了第三个元素,它是一个字符
    printf("%c\n", **++a);//a
    //注,这里 ++b 没有问题,而main函数中不能,这主要是因为这里的b指针是在原指针的基础上
    //重新拷贝的一份,所以可以随时改变它的指向
    printf("%d\n", **++b);//2
}
 
int main(int argc, char * argv[]) {
    char a1 = 'a';
    //字符串使用字符数组来存储
    char a2[]={'c','e','g','i','\0'};
    //可以直接赋值一个常量字符串,或是一个字符数组变量,或是一个字符变量的地址
    char *a[] = { "kmuw", a2, &a1 };
 
    int b1[] = { 1 };
    int b2[] = { 2, 3 };
    int b3 = 4;
    int *b[] = { b1, b2, &b3 };
 
    //编译出错,因为b是一个一维的指针数组,b是数组名,所以不能
    //修改其指向,但传递给其他函数后又可以修改,比如这里的 val 函数里
    //printf("%d\n", **(++b));
    val(a, b);
    return 0;
}
 

几种不同指针的定义

char **p:指向字符指针的列的二维整型数组的个元素的一维整型指针可以省略
    int b1[] = { 1 };
    int b2[] = { 2, 3 };
    int b3 = 4;
    int *b[] = { b1, b2, &b3 };
    printf("%d\n", **(b+1));//2
 
void * comp():返回一个空指针类型的函数。
void * comp() {
    char c = 'a';
    return &c;
}
int main(int argc, char * argv[]) {
    printf("%c\n",*((char*)comp()));//a
    return 0;
}
 
void * (*comp)():指向返回类型为空指针的个指向整型的指针的数组
int (*)[]         指向未指定元素个数的整型数组的指针
int *()           未指定参数、返回指向整型的指针的函数
int (*[])(void)   一个数组,其长度未指定,数组的元素为指向函数的指针,该函数没有参数且返回一个整型值
 

[C程序设计语言]第三部分的更多相关文章

  1. 基于C#程序设计语言的三种组合算法

    目录 基于C#程序设计语言的三种组合算法 1. 总体思路 1.1 前言 1.2 算法思路 1.3 算法需要注意的点 2. 三种组合算法 2.1 普通组合算法 2.2 与自身进行组合的组合算法 2.3 ...

  2. 《程序设计语言——实践之路(英文第三版)》【PDF】下载

    <程序设计语言--实践之路(英文第三版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382234 内容简介 <程序设计语 ...

  3. C语言程序设计I—第三周教学

    由于本课程是从教学周的第二周开始上课,所以第二次授课是发生在第三周,为了让PTA.云班课和博客能统一,所以将教学周作为随笔的标题.本周由于处理外聘教师随意退课等事情,总结有些延后了. 第三周教学安排 ...

  4. 20145213《Java程序设计》实验三敏捷开发与XP实践

    20145213<Java程序设计>实验三敏捷开发与XP实践 实验要求 1.XP基础 2.XP核心实践 3.相关工具 实验内容 1.敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法 ...

  5. 20145213《Java程序设计》第三周学习总结

    20145213<Java程序设计>第三周学习总结 教材学习内容总结 正所谓距离产生美,上周我还倾心于Java表面的基础语法.其简单的流程结构,屈指可数的基本类型分类,早已烂熟于心的运算符 ...

  6. 20145337《Java程序设计》第三周学习总结

    20145337 <Java程序设计>第三周学习总结 教材学习内容总结 类与对象 类与对象的关系:要产生对象必须先定义类,类是对象的设计图,对象是类的实例.我觉得在视频中对类与对象关系的描 ...

  7. 20145320《Java程序设计》第三次实验报告

    20145320<Java程序设计>第三次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.22 15: ...

  8. 20145225《Java程序设计》 实验三 "敏捷开发与XP实践"

    20145225<Java程序设计> 实验三 "敏捷开发与XP实践" 实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 git 上 ...

  9. 20145218 《Java程序设计》第三周学习总结

    20145218 <Java程序设计>第三周学习总结 教材学习内容总结 定义类 编写程序要产生对象就要先定义类.类是对象的设计图,对象是类的实例.类定义时使用class关键词,建立实例时, ...

随机推荐

  1. [转]编译Android源代码常见错误解决办法

    1. 编译时出现/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.so when ...

  2. php 缓存加速器软件

    Xcache 和 memcached 是两个不同层面的缓存,不存在可比性.Xcache 是 php 底层的缓存,它将PHP程式编译成字节码(byte code),再透过服务器上安装对应的程式来执行PH ...

  3. 使用 Delphi Xe 的 TDictionary

    原本一直使用 TList, 将定义的一个个 Record 保存在TList 里面, 为了能把某些对象管理起来, 例如一个类的 n 多实例,可以进行索引.查找.释放等 今天刚看到原来已经有了一个叫 TD ...

  4. python paramiko ssh.exec_command()启动tomcat服务器应用进程失败问题解决方法- Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this progr

    问题说明:

  5. Datatables带参重绘

    研究了好久,最后发现只需要加上参数("bDestory":true,) 即可实现每次刷新就是新的重绘,而无需调用什么desctory init clear等等函数..

  6. css改变背景透明度【转】

    兼容主流浏览器的CSS透明代码: .transparent_class { filter:alpha(opacity=50); -moz-opacity:0.5; -khtml-opacity: 0. ...

  7. SPOOL、SQLLOADER数据导出导入的一点小总结

    1.SQLLOADER的CONTROL文件 //**************************************************************************** ...

  8. 复利计算--4.0 单元测试之JAVA版-软件工程

    复利计算--4.0 单元测试-软件工程 前言:由于本人之前做的是C语言版的复利计算,所以为了更好地学习单元测试,于是将C语言版的复利计算修改为JAVA版的. 一.主要的功能需求细分: 1.本金为100 ...

  9. 使用Decision Tree对MNIST数据集进行实验

    使用的Decision Tree中,对MNIST中的灰度值进行了0/1处理,方便来进行分类和计算熵. 使用较少的测试数据测试了在对灰度值进行多分类的情况下,分类结果的正确率如何.实验结果如下. #Te ...

  10. A Round Peg in a Ground Hole(凸包应用POJ 1584)

    A Round Peg in a Ground Hole Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5684 Accepte ...