/指针

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

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

  /指针变量的赋值

    /{ 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. hadoop的两类配置文件及3种启动/关闭方式

    hadoop配置文件 默认配置文件:四个模块相对应的jar包中:$HADOOP_HOME/share/hadoop        *core-default.xml        *hdfs-defa ...

  2. 删除RAC集群节点

    删除GRID集群节点:参考oracle database 11g RAC手册(第二版) 目前GRID集群中节点信息:[grid@node1 ~]$ olsnodesnode1node2node3nod ...

  3. mysql八:视图、触发器、事务、存储过程、函数

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  4. Qt With Web(两种方法: WebAssembly,WebGL)

    Qt 写的程序,可以通过某些方式,在 web 上浏览 https://www.youtube.com/watch?v=OJ1ieyuIQzE​www.youtube.comhttps://www.yo ...

  5. Prime Path--POJ3126(bfs)

    Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...

  6. SQL Server 学习博客分享列表(应用式学习 + 深入理解)

    SQL Server 学习博客分享列表(应用式学习 + 深入理解) 转自:https://blog.csdn.net/tianjing0805/article/details/75047574 SQL ...

  7. js将form表单序列化[json字符串、数组、对象]

    1.序列化为字符串 $("#Form").serialize();//name=zhangsan&sex=1&age=20   2.序列化为数组 var formD ...

  8. shell date 获取昨天日期

    使用date -d 选项:  date  +"%Y%m%d" -d  "+n days"         今天的后n天日期       date  +" ...

  9. selenium python 启动Firefox

    我的火狐浏览器版本是最新的: 下载geckodrive:https://github.com/mozilla/geckodriver/releases/ 下载完后将exe文件放到这里“D:\firef ...

  10. js 使用jquery.form.js文件上传

    1.文件上传,使用jquery.form.js插件库 <!DOCTYPE html> <html> <head> <meta charset="UT ...