C_Learning(2)
/指针
/指针变量指向一个变量的地址
/给指针变量赋的值只能是地址
/指针变量的赋值
/{ 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)的更多相关文章
- C_Learning(3)
/ 结构体 / 声明结构体类型的一般形式: struct 结构体名[--表示的是这个结构体的类型] { 成员列表 }; [不要漏掉这个";"] / 声明结构可以放在main函 ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ASP.NET Core 之 Identity 入门(一)
前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Online Judge(OJ)搭建(第一版)
搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- 【.net 深呼吸】细说CodeDom(5):类型成员
前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...
随机推荐
- codeforces 761D - Dasha and Very Difficult Problem
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...
- Oracle备份恢复之冷备份恢复与异机还原
(同平台:rhel6.4~rhel6.4:同版本:oracle 11g 11.2.0.1~ oracle 11g 11.2.0.1) 冷备份发生在数据库关闭状态下,直接拷贝物理文件的备份方式,备份数据 ...
- SpringBoot 统一响应格式
-Spring Boot返回数据及异常统一封装 -企业实战之spring项目<接口响应体格式统一封装> -Spring Boot fastjson替换jackson -java web项目 ...
- sublime text3控制台每次报错会显示几行[ ]
如下图所示,每次编译报错的时候会显示: 我只需要报错信息,不想红框中的信息出现. 解决方案: 1 找到sublime Text3安装路径下的Default.sublime-package,如~Subl ...
- 【虫师讲Selenium+Python】第三讲:操作测试对象
一.首先呢,选择一个编辑器,我们这里选择的是Sublime Text >Ctrl+B为运行当前脚本的快捷方式 二.编写代码 #coding==utf-8 from selenium import ...
- chown 命令
root@localhost ~]# .txt # 同时修改文件属主和属组 !chown 执行上一个chown命令
- Ubuntu搭建solr搜索服务器
参考:http://blog.csdn.net/makang110/article/details/50971705 一:搭建solr服务器 1:安装jdk1.7,并配置环境变量 2:下载tomcat ...
- 使用对象作为hashMap的键,需要覆盖hashcode和equals方法
1:HashMap可以存放键值对,如果要以对象(自己创建的类等)作为键,实际上是以对象的散列值(以hashCode方法计算得到)作为键.hashCode计算的hash值默认是对象的地址值. 这样就会忽 ...
- keepalived+mysql 高可用集群
mysql 为主主模式参考 https://my.oschina.net/sanmuyan/blog/877373 192.168.100.129 mysql 主节点/keepalived 主节点 1 ...