函数

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. 初识Django之前端后端与数据库的配置

    目录 一.静态文件配置 二.关于form表单的补充 三.post请求出现403问题 四.request方法初识 4.1判断当前请求方式 4.2request.POST与request.GET 五.py ...

  2. Linux学习-利用inotify和rsync实现数据的实时同步

    一.inotify简介 1.inotify介绍 异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的 轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过i ...

  3. PHP培训教程 PHP里10个鲜为人知但却非常有用的函数

    php里有非常丰富的内置函数,很多我们都用过,但仍有很多的函数我们大部分人都不熟悉,可它们却十分的有用.这篇文章里,兄弟连小编列举了一些鲜为人知但会让你眼睛一亮的PHP函数. levenshtein( ...

  4. Linux内核设计与实现 总结笔记(第十章)内核同步方法

    一.原子操作 原子操作可以保证指令以原子的方式执行----执行过程不被打断. 1.1 原子整数操作 针对整数的原子操作只能对atomic_t类型的数据进行处理. 首先,让原子函数只接收atomic_t ...

  5. HDU 6206 Apple ( 高精度 && 计算几何 && 三点构圆求圆心半径 )

    题意 : 给出四个点,问你第四个点是否在前三个点构成的圆内,若在圆外输出"Accepted",否则输出"Rejected",题目保证前三个点不在一条直线上. 分 ...

  6. sublime格式化

    https://nodejs.org/dist/v6.2.0/node-v6.2.0-x64.msi sublime格式化

  7. 软件工程 in MSRA 黄金点游戏-第一次结对编程

    简单介绍 第一次结对编程,邹欣老师选择了一个博弈游戏作为题目.博弈论是一门非常有趣的学科.之前竞赛时接触的博弈论大部分都是存在均衡点/必胜策略的.像这次这种多人参与,没有完美策略,你方唱罢我登台的游戏 ...

  8. [luogu]P3939 数颜色[二分]

    [luogu]P3939 数颜色 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排, ...

  9. Go实现分布式外部排序

    Go实现分布式外部排序 项目路径: https://github.com/Draymonders/go_external_sort 默认读入文件: small.in 默认输出文件:small.out ...

  10. plt.imshow()为什么不能显示同时显两张照片

    在编程的过程中发现plt.imshow()不能同时显示两张照片,如果有两条plt.imshow()语句处于一前一后的位置,那么程序运行后只会显示后面的图片.如果想让每一张图片都显示出来,需要在每一个p ...