/指针

  /指针变量指向一个变量的地址

  /给指针变量赋的值只能是地址

  /指针变量的赋值

    /{ int a; int *p; p=&a; } or { int a; int *p=&a; }

    /指针必须先定义后使用

    /不能把一个具体的数赋给指针

  

  / &是取地址运算符,&q 表示取变量 q 的地址

  / *是指针运算符,*p 表示返回指定地址内变量的值

  / 因此,p=&q 表示的是地址;scanf 中 &q 表示往该地址写入操作数;printf 中的 q 表示输出变量 q 地址中存放的操作数;*p 表示输出变量 p 指向的地址中存放的操作数

  / &* 和 *& 的区别

    / & * 的运算优先级相同,按自右向左方向结合

    / &* 表示先进行指针运算,再取地址;(&*p=&(*p)=&a)——是一个地址

    / *& 表示先取地址,再进行指针运算;(*&p=*(&p))——是地址中的操作数

  / 指针的自增自减(p++,p--)造成内存地址按照其所指向的数据类型的直接长度的增或减

  / 指针与数组

    / { int a[100],*p; p=a;}

    / p=a表示将数组 a[100] 的首地址赋给指针变量 p,即 p=&a[0]

    / *(p+n)=*(a+n) ,表示数组 a[100] 第n个元素

    / &a[i][j]、(a[i]+j) 表示第 i 行第 j 列的元素"地址"!

  / 指针与字符串

    / { char *str="hello"; printf ("%s",str); }

    / 这里不是将 hello 赋给指针变量 str ,而是把字符串 "hello" 的首字母地址赋给 str

    

  / 指针数组

    / { char *str[]={"abc","def","ghi"} }

    / 一个数组,其元素均为指针类型数据,则称为指针数组

    / 由于字符型数组的长度必须大于最长元素的长度,因此,使用指针数组可以大大减少这样的存浪费

  / 指向指针的指针

    / 这种问题只有在实战当中才能得到深刻理解,实例参见:count_even.c / count_even_2.c / count_even_3.c

 // 统计数组中偶数的个数

 #include <stdio.h>

 int main()
{
int a[], *p, **q, i, n=;
printf ("Please input:");
for (i=; i<; i++)
scanf ("%d",&a[i]);
p=a;
q=&p;
printf ("The array is :");
for (i=; i<; i++)
{
if (*(*q+i)%==)
{
n++;
printf ("%5d",*(*q+i));
}
}
printf ("\n");
printf ("The number is :%d.\n",n); return ;
}

count_even.c

 // 统计数组元素中偶数的个数(2)

 #include <stdio.h>

 int main()
{
int a[], *p, **q, n=;
printf ("Please input:\n");
for (p=a; p-a<; p++)
{
q=&p;
scanf ("%d",*q);
}
printf ("The array is:");
for (p=a; p-a<; p++)
{
q=&p;
if (**q%==)
{
printf ("%5d",**q);
n++;
}
}
printf ("\n");
printf ("The number is:%d.\n",n); return ;
}

count_even2.c

 // 统计数组元素中的偶数个数(3)

 #include <stdio.h>

 int main()
{
int a[], *p, n=;
printf ("Please input:\n");
for (p=a; p-a<; p++)
{
scanf ("%d",p);
}
printf ("The array is:\n");
for (p=a; p-a<; p++)
{
if (*p%==)
{
printf ("%5d",*p);
n++;
}
}
printf ("\n");
printf ("The number is:%d.",n); return ;
}

count_even3.c

  

  / 指针变量作函数参数

    / 实例参见swap.c / swap2.c

 // 交换两个数swap.c

 #include <stdio.h>

 // 定义交换函数swap
int swap(int *a, int *b); // 主函数
int main()
{
int x, y, *p_x, *p_y;
printf ("Please input two number:\n");
scanf ("%d,%d", &x, &y);
p_x=&x;
p_y=&y;
swap(p_x, p_y);
printf ("x=%d or *p_x=%d", x, *p_x);
printf ("y=%d or *p_y=%d", y, *p_y); return ;
} // 交换函数swap定义区域
int swap(int *a, int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp; return ;
} // 为什么不能使用如下源程序swap2.c?
/*
#include <stdio.h> int swap(int a, int b); int main()
{
int x, y;
printf ("please input two number:\n");
scanf ("%d%d", &x, &y);
swap(x,y);
printf ("x=%d.\n", x);
printf ("y=%d.\n", y); return 0;
} int swap(int a. int b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
*/
// 在函数调用过程中,主调用函数与被调用函数之间的数值传递是单向的,即只能把实参的值传递给形参,而不能把形参传递给实参。因此,如果使用swap2.c,形参的值会发生改变,但实参的值却不会发生任何变化。
// 而使用指针来传递参数,既可以减少值传递带来的开销,也可以使函数调用不产生值传递,即只要保证指针指向的地址是正确的即可。

swap.c

 // 交换两个数swap2.c

 #include <stdio.h>

 int swap(int a, int b);

 int main()
{
int x, y;
printf ("please input two number:\n");
scanf ("%d%d", &x, &y);
swap(x,y);
printf ("x=%d.\n", x);
printf ("y=%d.\n", y); return ;
} int swap(int a. int b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}

swap2.c

  / 指向函数的指针

    / 指针可以指向函数,一个函数在编译时被分配给一个入口地址,这个函数的入口地址就称为函数的指针

    / 一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址

    / 实例见 perimeter.c

 // 根据指针函数的概念,使用指针函数计算长方形周长

 #include <stdio.h>

 int *per(int a, int b);
int perimeter; int main()
{
int width, lenth;
int *result;
printf ("please input width and lenth:");
scanf ("%d%d", &width, &lenth);
result=per(width, lenth);
printf ("\nthe perimeter is :%d", *result); return ;
} int *per(int a, int b)
{
int *p;
p=&perimeter;
perimeter=*(a+b);
return p;
}

perimeter.c

  / 指针数组作 main 函数的参数

    / main 函数可以是无参函数,也可以是有参函数

    / main 函数的带参形式:main(int argc, char *argv[])

    / argc 记录了命令和参数的个数,指针数组 argv[] 的大小由命令和参数的个数决定

    / 实例见main_pointer.c

 // main 函数的有参实例

 #include <stdio.h>

 main(int argc, char *argv[])
{
printf ("the list of parameter:\n");
printf ("command:\n");
printf ("%s\n",*argv);
printf ("the number of parameter:");
printf ("%d",argc);
} // 运行的结果如下:
the list of parameter:
command:
C:\Administrator\Desktop\jan5\main_parameter.exe
the number of parameter:

main_parameter.c

C_Learning(2)的更多相关文章

  1. C_Learning(3)

    / 结构体 / 声明结构体类型的一般形式: struct 结构体名[--表示的是这个结构体的类型] {    成员列表 }; [不要漏掉这个";"] / 声明结构可以放在main函 ...

  2. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  3. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  4. ASP.NET Core 之 Identity 入门(一)

    前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...

  5. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  6. Online Judge(OJ)搭建(第一版)

    搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...

  7. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  8. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

  9. 【.net 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

随机推荐

  1. 《机器学习实战》2.2.2分析数据:使用matplotlib创建散点图

    #输出散点图 def f(): datingDataMat,datingLabels = file2matrix("datingTestSet3.txt") fig = plt.f ...

  2. Master Boot Record

    https://en.wikipedia.org/wiki/Master_boot_record https://zh.wikipedia.org/wiki/主引导记录 A master boot r ...

  3. Docker,docker-machine,docker-composer

    https://docs.docker.com/engine/installation/mac/ Docker值得关注的特性文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里.资源隔离:系统资 ...

  4. 系统之锹sysdig:Linux服务器监控和排障利器

    当你需要追踪某个进程产生和接收的系统调用时,首先浮现在你脑海中的是什么?你可能会想到strace,那么你是对的.你会使用什么样的命令行工具来监控原始网络通信呢?如果你想到了tcpdump,你又作出了一 ...

  5. navicat的安装

    1.首先在官网下载navicat,具体安装步骤比较简单,下一步下一步即可. 2.安装之后,按照下面的网址做法激活 http://www.jianshu.com/p/b1f9194e1e31 3.教程: ...

  6. 【生产问题】LDF丢失

    参考 : https://www.cnblogs.com/gered/p/9450622.html CREATE DATABASE db_logs ON PRIMARY ( NAME % ) LOG ...

  7. android 网络监测

    public class NetWorkStateReceiver extends BroadcastReceiver { @Override public void onReceive(Contex ...

  8. oj2894(贝尔曼福特模板)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2894 就因为粗心,一中午没A,题目说是2000 ...

  9. list的*运算使用过程中遇到的问题

    目的: 想生成一个[[],[],[]] 这样的列表, 所以就 [[]]*3 这样做了,但是这样做会有问题,这样list中的三个list其实是同一个list. 例如:a=[[]]*3,然后a[0].ap ...

  10. Fuzzy and fun on Air Jordan 12 Doernbecher design

    Carissa Navarro keeps it warm, fuzzy and fun on her 2017 Air Jordan 12 Doernbecher design. Nike's 20 ...