函数

int func(int x){        //x:形式参数
....
} int main(){
....
int res=func(z); //z:实际参数
}

实参与形参具有不同的存储单元,

实参与形参变量的数据传递是“值传递”;

函数调用时,系统给形参分配存储单元,并将实参对应的值传递(copy)给形参;

P.S. 实参与形参的类型必须相同或可以兼容;

示例:

#include<iostream>
using namespace std;
void exchange(int a, int b){
int p;
p = a; a = b; b = p;
}
int main(){
int a = , b = ;
exchange(a, b);
cout<<a<<" "<<b<< endl;
return ;
}

输出结果将会是3 5.  因为在调用exchange()时,main函数里的a和b的值被copy给exchange(),然后修改的是exchange函数内存空间里的a和b,而不是main函数内的。那如何实现exchange功能呢?可以用指针

#include<iostream>
using namespace std;
void exchange(int *a, int *b){
int p;
p = *a; *a = *b; *b = p;
}
int main(){
int a = , b = ;
exchange(&a, &b);
cout<<a<<" "<<b<< endl;
return ;
}

如果是数组作为函数参数呢?

#include <iostream>
using namespace std;
void change(int a, int b){
a = ; b = ;
}
int main()
{
int a[] = {, };
change(a[], a[]);
cout<<a[]<<" "<<a[]<<endl;
return ;
} 这里数组元素a[0]和a[1]和普通变量一样,是直接值拷贝过去的。所以输出还是3 5
#include <iostream>
using namespace std;
void change(int z[]){
z[] = ; z[] = ;
}
int main(){
int a[] = { , };
change(a);
cout << a[] <<" "<< a[] << endl;
return ;
} 返回结果是30 50. 这里参数传递的时候copy的是数组a的名字(a是一个常量,表示数组a在内存中的地址)。这样change函数内就直接找到a[0]和a[1]对应的内存空间进行修改了。

函数执行结束之后,函数内的所有内容(eg 局部变量)都会被销毁


指针

&x  取变量x的地址

*p  取地址p中的内容

*&x   等价于   x

int *p;                    //指针变量,存放地址。
int c=;
int d=;
int e=;
p=&c; //表示把c的地址赋给p
cout<<c<<" "<<*p<<endl; //888 888
*p=; //表示把p所指向的存储单元(也就是c)的内容改成666
cout<<c<<" "<<*p<<endl; //666 666
c=d; //再改成999
cout<<c<<" "<<*p<<endl; //999 999
*p=e; //再改成233
cout<<c<<" "<<*p<<endl; //233 233

两个例子:

     int ic=;
int *ip=&ic;
*ip=;
cout<<ic<<endl;
cout<<ip<<endl;
cout<<&ic<<endl;
cout<<*ip<<endl;
cout<<&ip<<endl; //指针变量的地址 Output: 0x7ffe4b072e04
0x7ffe4b072e04 0x7ffe4b072e08 --------------------------------------------------- int a=,b=;
int *p1=NULL, *p2=NULL;
int *tmp=NULL;
p1=&a;
p2=&b;
if(*p1>*p2){
tmp=p1; p1=p2; p2=tmp; //交换的是p1和p2两个指针
}
cout<<*p1<<" "<<*p2<<endl;
cout<<a<<" "<<b<<endl;

对指针变量做++的含义:  int *p;    p++;    //p=p+(sizeof(int));

指向数组的指针

int a[10];   int *p;   p=a;

【 数组名相当于指向数组第一个元素的指针】
如果有一个  int a[4]={1,2,3,4};

  • 若 a 是 指向数组第一个元素 的指针, 即a相当于&a[0];
  • a是指向a[0]的指针,a+1将跨越sizeof(int)=4个字节
  • &a是“指向数组”的指针; &a+1将跨越4*sizeof(int)=16个字节;
    • &a 相当于 管辖范围“上升” 了一级;
  • *a 是数组的第一个元素a[0];即*a等价于a[0] ;
    • *a 相当于 管辖范围“下降” 了一级;

二维数组的指针

int a[3][3]={{1,2,3}, {4,5,6}, {7,8,9}};

a[0]  -  a[0][0] a[0][1] a[0][2]

a[1]  -  a[1][0] a[1][1] a[1][2]

a[2]  -  a[2][0] a[2][1] a[2][2]

a[0]是指向数组{a[0][0], a[0][1], a[0][2]}的第一个元素a[0][0]的指针,管辖范围 = sizeof(a[0][0]) = sizeof(int)

a是指向数组{a[0], a[1], a[2]}的第一个元素a[0]的指针,管辖范围 = sizeof(a[0]) = 3*sizeof(int)

&a是指向整个数组a的指针,管辖范围 = sizeof(a) = 9*sizeof(int)

  • a与&a[0]等价
  • a[0]与&a[0][0]等价
  • a[0]与*a等价
  • a[0][0]与**a等价
     
  • 数组名相当于指向数组第一个元素的指针
  • &E 相当于把E的管辖范围上升了一个级别
  • *E 相当于把E的管辖范围下降了一个级别

指针操作字符串

char buf[]="ABC";
char *pc;
pc="hello"; //hello是常量,不能修改
cout<<pc<<endl; //hello
pc++;
cout<<pc<<endl; //ello
cout<<*pc<<endl; //e
pc=buf; //相同类型指针之间的赋值
cout<<pc<<endl; //ABC

 指针作为函数参数

#include <iostream>
using namespace std; int maxvalue(int (*p)[]) //p和a类型一样,是指向a[0]的指针
//int maxvalue(int p[][4]) //这样也可以。c编译器将形参数组名作为指针变量来处理
{
int max = p[][];
for(int i=; i<; i++)
for(int j=; j<; j++)
if(p[i][j]>max)
max = p[i][j];
*p[i]
return max;
}
int main( )
{
int a[][] = {{,,,},{,,,},{,,,}};
cout<<"The Max value is "<<maxvalue(a);
return ;
}
int maxvalue(int p[])
//int maxvalue(const int p[]) //如果想限制对原数组的修改,可以加const。
{
int max = p[];
for(int j=; j<; j++)
if(p[j]>max)
max = p[j];
*p=; //可以这样修改原数组的值
return max;
}
int main( )
{
int a[] = {,,,};
cout<<"The Max value is "<<maxvalue(a)<<endl;
cout<<a[]<<endl; //
return ;
}
void mystrcpy(char *dest, const char *src){
......
//保证src不会被修改
}
int main(){
char a[] = “How are you!”;
char b[];
mystrcpy(b,a);
cout<<b<<endl;
return ;
}
int main(){
const int a=;
const int b=;
int c=; const int *pi=&a;
*pi=; //不可以,*p是a,不能修改
pi=&b; //可以。p本身是可以修改的
*pi=; //不可以。*p是b,不能修改
pi=&c; //不可以。c是int,而pi是指向const int的指针
*pi=; //不可以
}

指针用做函数返回值

#include <iostream>
using namespace std; int *get(int arr[ ][], int n, int m){
int *pt;
pt = *(arr + n - ) + m-; //arr+n-1是指向int[4] {5,6,7,8}的指针,加一个*获取这个小数组的地址
return(pt);
} int main(){
int a[][]={, , , ,
, , , ,
, , , ,
, , , };
int *p;
p = get(a, , );
cout<<*p<<endl;
}

静态局部变量:函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放。在下一次该函数调用时,仍可以继续使用该变量;

#include <iostream>
using namespace std; int *getInt1(){
static int value1 = ;
return &value1;
}
int *getInt2(){
static int value2 = ;
return &value2;
}
void func(){
int a=;
static int b=; //整个程序运行周期中只执行一次。函数退出后仍然保留b的值
a++;
b++;
cout<<a<<" "<<b<<endl;
} int main(){
int *p,*q;
p = getInt1();
q = getInt2();
cout << *p << endl;
cout << *q << endl;
for(int i=;i<;i++){
func();
}
return ;
} --------------------------------
output:

111

c知识点总结2的更多相关文章

  1. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  2. ASP.NET MVC开发:Web项目开发必备知识点

    最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...

  3. UWP开发必备以及常用知识点总结

    一直在学UWP,一直在写Code,自己到达了什么水平?还有多少东西需要学习才能独挡一面?我想对刚接触UWP的开发者都有这种困惑,偶尔停下来总结分析一下还是很有收获的! 以下内容是自己开发中经常遇到的一 ...

  4. C#高级知识点&(ABP框架理论学习高级篇)——白金版

    前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...

  5. lucene 基础知识点

    部分知识点的梳理,参考<lucene实战>及网络资料 1.基本概念 lucence 可以认为分为两大组件: 1)索引组件 a.内容获取:即将原始的内容材料,可以是数据库.网站(爬虫).文本 ...

  6. DoraCMS 源码知识点备注

    项目需要研究了下DoraCMS这款开源CMS,真心做的不错:).用的框架是常用的express 4 + mongoose,代码也很规范,值得学习. 源码中一些涉及到的小知识点备注下: https:// ...

  7. atitit 商业项目常用模块技术知识点 v3 qc29

    atitit 商业项目常用模块技术知识点 v3 qc29 条码二维码barcodebarcode 条码二维码qrcodeqrcode 条码二维码dm码生成与识别 条码二维码pdf147码 条码二维码z ...

  8. HTML5知识点总结

    HTML5知识点总结(一) 一.HTML新增元素 1.IE9版本以下支持HTML5的方法 <!--[if lt IE9]> <script src="http://cdn. ...

  9. JavaScript易错知识点整理

    前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...

  10. Sqlserver中一直在用又经常被忽略的知识点一

    已经有快2个月没有更新博客了,实在是因为最近发生了太多的事情,辞了工作,在湘雅医院待了一个多月,然后又新换了工作...... 在平时的工作中,Sqlserver中许多知识点是经常用到的,但是有时候我们 ...

随机推荐

  1. Stree

    题目 给出n个点,m条有权边,现对于每一条边,你需要回答出包含这条边的最小生成树的总边权值. 分析 首先我们可以构造一个对于这n个点,m条有权边的最小生成树,显然,这是一棵最小的生成树. 那么这棵生成 ...

  2. 【NOIP2015模拟10.22】最小代价

    前言 本来在比赛上就想到最小生成树了,但不相信这道题那么简单,然后就没有然后了... 题目 给出一幅由n个点m条边构成的无向带权图. 其中有些点是黑点,其他点是白点. 现在每个白点都要与他距离最近的黑 ...

  3. 分布式事务 GTS 的价值和原理浅析

    GTS 今年双 11 的成绩 今年 2684 亿的背后,有一个默默支撑,低调到几乎被遗忘的中间件云产品——GTS(全局事务服务,Global Transaction Service),稳稳地通过了自 ...

  4. 【FJ省队训练&&NOIP夏令营】酱油&&滚粗记

    FJOI2016省队训练滚粗记 2016.07.03~2016.07.06(Day1~5) 在学校期末考.因为才省选二试too young too simple爆蛋了所以下半个学期只能滚回去读文化课, ...

  5. python 指定画图分辨率

    from IPython.core.pylabtools import figsize # import figsize figsize(12.5, 4) # 设置 figsize plt.rcPar ...

  6. android 开发,视频群聊引发短信异常

    说到 NDK 开发,其实是为了有些时候为了项目需求需要调用底层的一些 C/C++ 的一些东西:另外就是为了效率更加高些. 但是很多时候能不用就不用:这个是啥原因?个人感觉有些时候是觉得麻烦,首先要配置 ...

  7. #1123-JSP隐含对象

    JSP 隐含对象 JSP隐含对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明.JSP隐含对象也被称为预定义变量. JSP所支持的九大隐含对象: 对象,描述 reque ...

  8. synchronized 同步

    1.synchronized关键字的作用域有二种: 1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有 ...

  9. 大数据笔记(十五)——Hive的体系结构与安装配置、数据模型

    一.常见的数据分析引擎 Hive:Hive是一个翻译器,一个基于Hadoop之上的数据仓库,把SQL语句翻译成一个  MapReduce程序.可以看成是Hive到MapReduce的映射器. Hive ...

  10. 获取项目配置的常用方法(Struts/Servlet)

    struts: //web.xml中: <context-param> <param-name>paramName</param-name> <param-v ...