C语言高速入口系列(七)

C语言指针进阶

本章引言:

在前面第5节中我们对C语言的指针进行了初步的学习理解;作为C语言的灵魂,

C指针肯定没那么简单,在这一节中,我们将会对指针进行进一步的学习,比方二级指针,

指针数组,内存分配和const修饰指针常量等!以下就请大家尾随笔者的脚步,对

C指针神奇的一面进行进一步的解析吧!

本节学习路线图:

函数与指针:

①指针作为函数的形參:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

②指向函数的指针:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

③指针函数:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

④带參数的主函数

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

ps:该代码的执行:先要编译生成exe文件后,来到exe所在文件文件夹下:输入:  文件名称  one two three   

会输出:one two three  

指针数组:

两个问题:怎样保存一个字符串?假设保存的不止一个,而是多个呢?

第一个问题:

①char name[20] = "~~~"   ②char *name = "~~~"       //前者定义了长度,不能直接赋值,明显后者比較灵活

第二个问题:见图

二级指针:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29kZXJfcGln/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

内存的动态分配:

代码演示样例:

动态分配10个整型的空间大小,假设大于这个数目则动态分配,否则利用realloc又一次分配内存

ps:代码没问题,vc6一直报执行时错误,假设出错了,用C-Free或者Visual studio等编译器试试!

<span style="font-family:Microsoft YaHei;">#include <stdio.h>
#include <stdlib.h>
#define N 10 int main()
{
int *p = 0;
int i,num,*q = 0;
p = (int *)malloc((N * sizeof(int)));
if(p == 0)
{
printf("内存分配错误!\n");
exit(0);
}
printf("请输入要存储的元素个数:\n");
scanf("%d",&num);
if(num <= N)
{
for(i = 0;i < N;i++)
scanf("%d",p+i);
}
else
{
for(i = 0;i < num;i++)
q = (int *)realloc(p,(N + N)*sizeof(int));
if(q == 0)exit(0);
for(i = 0;i < num;i++)
scanf("%d",q + i);
p = q;
}
for(i = 0;i < num;i++)
printf("%3d",*(p+i)); printf("\n");
free(p);
return 0;
}</span>

使用const修饰指针变量

我们都知道使用const修饰一个基本数据类型的变量,能够让变量存储的值从头到尾都不变

我们的程序不能进行改动!

只是修饰指针变量就有点差异了:

比方:

int a = 3,b = 4; const int *p = &a;

假设我们再加入一句代码: p = &b;的话就会报错

假设加入: a = 5;代码并不出错,此时 *p ==  a == 5;

分析结果:

使用const修饰指针时,表明该指针是一个常量指针,它所指向的变量的值是能够改动的;

可是改动指针指向的地址则是错误的。!

在C很多的标准库函数都将某些指针參数的类型前加上const,目的是保护參数!

ps:int *const p = &a;    const  int * const p = &a;   和上面的都是等价的!

本章小结:

①函数与指针:

1.指针作为函数的形參: 指针參数相应的实參须要为变量地址

2.指向函数的指针:函数的首地址称为函数的指针,通过函数名能够找到而且运行函数

3.指针函数:返回值类型是一个指针

4.带參数的主函数: int main(int argc,char *argv[]) :形參依次为:记录參数个数和存储參数内容的字符串数组

②指针数组

二维数组存放字符串与指针数组存放字符串的比較

③二级指针

指向指针变量的指针

④内存的动态分配:

1.内存分配图

2.C语言提供的四个内存分配函数的使用:malloc(),calloc(),realloc(),free()的使用

⑤使用const修饰指针变量

能够改动的指向地址的变量的值,不能改动的是指针所指向的地址!

版权声明:本文博主原创文章。博客,未经同意不得转载。

C语言高速入口系列(七)的更多相关文章

  1. C语言高速入门系列(二)

    C语言高速入门系列(二) -----转载请注明出处coder-pig 本节引言: 在前面一节中我们对C语言进行了初步的了解,学会了使用IDE进行代码的编写,编译执行! 在这一节中我们会对C语言的基本的 ...

  2. C语言高速入门系列(八)

    C语言高速入门系列(八) C语言位运算与文件 本章引言: 在不知不觉中我们的C高速入门系列已经慢慢地接近尾声了,而在这一节中,我们会对 C语言中的位运算和文件进行解析,相信这两章对于一些人来说是陌生的 ...

  3. C语言高速入门系列(四)

    C语言高速入门系列(四) C语言数组 ---------转载请注明出处:coder-pig 贴心小提示:假设图看不清晰可右键另存为,应该就非常清晰了; 注意上面的代码都要自己过一遍哦! 本节引言: 经 ...

  4. C语言高速入门系列(一)

    C语言高速入门系列(一)  本系列引言: 本教程的宗旨是将C语言入门的内容进行关键知识点的提纯,将一些笼统的废话去除; 再进行压缩,然后将本章的关键知识点做成路线图的,能够更加方便地掌握学习的方向; ...

  5. C语言高速入门系列(五)

    C语言高速入门系列(五) C语言指针初涉                                           ------转载请注明出处:coder-pig 本节引言: 上一节我们对C ...

  6. SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现

    原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft ...

  7. struts2官方 中文教程 系列七:消息资源文件

    介绍 在本教程中,我们将探索使用Struts 2消息资源功能(也称为 resource bundles 资源绑定).消息资源提供了一种简单的方法,可以将文本放在一个视图页面中,通过应用程序,创建表单字 ...

  8. Keil MDK STM32系列(七) STM32F4基于HAL的PWM和定时器

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  9. WCF编程系列(七)信道及信道工厂

    WCF编程系列(七)信道及信道工厂   信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...

随机推荐

  1. Windows SVN变化邮件通知(Python2.7实现)

    1,新增文件post-commit.bat 内容: rem REPOS-PATH (the path to this repository) set REPOS=%1 rem REV (the num ...

  2. IOS使用C#预处理命令,多种SDK共存

    当我们使用Unity接 91,XY助手等等SDK时候. 我们需要使用[DllImport("__Internal")] 来声明一个C++的方法调用. 不同的SDK总会有不同的方法. ...

  3. Unity扩展 自定义事件Send组件

    在写项目的时候,我创建了一个方法里面需要一个int的参数.  我记得是UIEvent Trigger 不能直接传递一个数字,最多只能传递一个GameObject属性过去(=.=那个值不想再组件上定义) ...

  4. 关于Node.js, Jade一点小小的介绍。

    本文出自:http://blog.csdn.net/svitter node.js大家知道的可能比較多,可是jade大家可能就不知道了.. GFW封杀掉google以后.今天在百度上找了好久也没有找到 ...

  5. Struts2使用Interceptor实现权限控制的应用实例详解

    Struts2使用Interceptor实现权限控制的应用实例详解 拦截器:是Struts2框架的核心,重点之重.因此,对于我们要向彻底学好Struts2.0.读源码和使用拦截器是必不可少的.少说了. ...

  6. [KMP求最小循环节][HDU3746][Cyclic Nacklace]

    题意 给你个字符串,问在字符串末尾还要添加几个字符,使得字符串循环2次以上. 解法 无论这个串是不是循环串 i-next[i] 都能求出它的最小循环节 代码: /* 思路:kmp+字符串的最小循环节问 ...

  7. 去掉firefox点击按钮时的虚线边框

    去掉火狐里面点击按钮时候的虚线边框 button::-moz-focus-inner, input[type="reset"]::-moz-focus-inner, input[t ...

  8. zepto的touch.js左右滑动存在一些问题,用百度的touch.js代替

    这几天用zepto想写一个移动端的活动,在实现左右滑动触发动画时,发现zepto的touch.js在ios的微信上有问题. 问题描述:左右滑动时如果手指没有一直跟频幕贴着(在手机上滑动时,如果手指不是 ...

  9. Hibernate 查询:HQL查询(Hibernate Query Languge)

    HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念. 使用HQL查询所有学生: public static void main(String[] args) { Sess ...

  10. 000-C#基础

    C#中数据类型的继承关系如下 System.Object |-------------System.ValueType | |-------System.Boolean | |-------Syste ...