/指针

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

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

  /指针变量的赋值

    /{ 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. codeforces 761D - Dasha and Very Difficult Problem

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  2. HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题

    http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...

  3. Oracle备份恢复之冷备份恢复与异机还原

    (同平台:rhel6.4~rhel6.4:同版本:oracle 11g 11.2.0.1~ oracle 11g 11.2.0.1) 冷备份发生在数据库关闭状态下,直接拷贝物理文件的备份方式,备份数据 ...

  4. SpringBoot 统一响应格式

    -Spring Boot返回数据及异常统一封装 -企业实战之spring项目<接口响应体格式统一封装> -Spring Boot fastjson替换jackson -java web项目 ...

  5. sublime text3控制台每次报错会显示几行[ ]

    如下图所示,每次编译报错的时候会显示: 我只需要报错信息,不想红框中的信息出现. 解决方案: 1 找到sublime Text3安装路径下的Default.sublime-package,如~Subl ...

  6. 【虫师讲Selenium+Python】第三讲:操作测试对象

    一.首先呢,选择一个编辑器,我们这里选择的是Sublime Text >Ctrl+B为运行当前脚本的快捷方式 二.编写代码 #coding==utf-8 from selenium import ...

  7. chown 命令

    root@localhost ~]# .txt # 同时修改文件属主和属组 !chown 执行上一个chown命令

  8. Ubuntu搭建solr搜索服务器

    参考:http://blog.csdn.net/makang110/article/details/50971705 一:搭建solr服务器 1:安装jdk1.7,并配置环境变量 2:下载tomcat ...

  9. 使用对象作为hashMap的键,需要覆盖hashcode和equals方法

    1:HashMap可以存放键值对,如果要以对象(自己创建的类等)作为键,实际上是以对象的散列值(以hashCode方法计算得到)作为键.hashCode计算的hash值默认是对象的地址值. 这样就会忽 ...

  10. keepalived+mysql 高可用集群

    mysql 为主主模式参考 https://my.oschina.net/sanmuyan/blog/877373 192.168.100.129 mysql 主节点/keepalived 主节点 1 ...