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):类型成员
前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...
随机推荐
- Scala学习笔记(3)-表达式归纳
语法:使用表达式定义值和变量 val <identifier>[:<type>]=<expression> 字面值类型 var <identifier> ...
- 关于graham扫描法求凸包的小记
1.首先,凸包是啥: 若是在二维平面上,则一般的,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点. ───────────────────────────── ...
- Oracle管理监控之Oracle用户权限
数据字典 1.动态数据字典是以v$xxx开始的数据字典,在数据库中约有150个左右,这些数据字典反映数据库动态运行状况,在不同时间查询会得到不同的结果. 2.DBA数据字典是以DBA_xxx表示,该数 ...
- 使用Maven导出项目依赖的jar包
步骤1.进入项目目录(有pom.xml的目录) 2.创建存放导出jar依赖包的目录 3.地址栏输入cmd,回车 4.输入导出命令,回车mvn dependency:copy-dependencies ...
- 推荐两个国外网站-帮你优化网站SEO和预测下期的PR值
第一个:http://www.domaintools.com/ (谷歌SEO网站优化伴侣)可以测试你优化网站的分数. 这里使用说明,简单说一下吧: 打开网站后输入自己的域名,点击搜索按钮 第二个查看分 ...
- Redis经验谈(转)
原文:http://www.programmer.com.cn/14577/ 新浪作为全世界最大的Redis用户,在开发和运维方面有非常多的经验.本文作者来自新浪,希望能为业界提供一些亲身经历,让大家 ...
- 用 Python 替代 Bash 脚本(转)
add by zhj: 其实作者是想说用Python来做那些Bash实现起来比较麻烦的部分,即将Bash与Python结合使用. 英文原文:http://www.linuxjournal.com/co ...
- table的td的1%
使用media-obj和media-bd类似的样式,大多数采用的是display: table-cell(即是table中td)来实现.当然设置display是不够,还要根据情况设置width.如下面 ...
- python 基础 内置函数
内置参数 print(all([5,-1,5])) # 非0都是真 true print(all([0,-1,5])) # false print(any([1,0,5])) # 有一个数据为真,就为 ...
- Java-mybatis-一次执行多条SQL语句
mysql数据库 1.修改数据库连接参数加上allowMultiQueries=true,如: hikariConfig.security.jdbcUrl=jdbc:mysql://xx.xx.xx: ...