Linux C 程序 指针数组和二级指针(TEN)
指针数组和二级指针
#include<stdio.h>
int main(){
] = {,,,,};
], i;
int **pp = p;
//使p指针数组指向每一个a
; i < ; i++){
p[i] =&a[i];
}
//【】优先级高于* ,*(p[i]) p[i] = &a[i],so==> *p[i] = *&a[i] = a[i]
; i < ; i++){
printf("%d ",*p[i]);
}
printf("\n");
//p 和 pp都是二级指针,i=0时,*pp=p[0] ,p[0]=&a[i],*pp=a[0].
//执行pp++之后,pp指向p[1],*pp=p[1],p[1]=&a[1].
; i < ; i++,pp++){
printf("%d ",**pp);
}
;
}
output:
指针与数组的 关系
nclude<stdio.h>
int main(){
][] = {,,,,,,,,,};
//表示p是一个指针,指向含有五个元素的一维数组
],i;
//p指向二维数组得第一行
p = a ;
//p=a 之后 , p=&a , *p = a[1].
//p是一个数组指针
; i < ; i++){
printf("%d ",(*p)[i]);
//(*p)[i] 是先取p的内容作为数组的起始地址,然后再去第i个元素。
//*p[i]是先取以p为起始地址的第i个元素,该元素为指针,然后取该指针的内容。
}
printf("\n");
//p移动到第二行
p++;
; i < ; i++){
printf("%d ",(*p)[i]);
}
printf("\n");
;
}
] ;//一个指针
] ; //含有五个元素的数组,长度为5,数组中得每一个元素指向一个整型变量。
函数和指针
1.指针作为函数得参数
作用是将一个变量的地址传送到一个函数中
#include<stdio.h>
void change(int i , int *p){
i++;
if(p != NULL){
(*p)++;//根据地址找到变量b,b+1
}
}
int main(){
, b = ;
change(a,&b);
printf("a=%d,b=%d",a,b);
;
}
2.返回指针得函数
int *f(int i , int j);
() 的优先级高于 *
表示 f是一个函数,函数名前有一个指针,表示此函数得返回值类型为指针。
include<stdio.h>
//定义一个名称为name得指针数组,每个数组元素都指向一个字符串
] = {"monday","tuesday","wednessday","thursday","friday","saturday","sunday"};
//定义一个指针,这个指针指向一个字符串
char *message = "wrong input";
//返回指针的函数
char *week(int day){
|| day > ){
return message ;
}else{
] ;
}
}
int main(){
int day ;
char *p;
printf("input a number of a week:\n");
scanf("%d",&day);
p = week(day);
printf("%s\n",p);
;
}
3.指向函数的指针:
#include<stdio.h>
#define GET_MAX 0
#define GET_MIN 1
int get_max(int i , int j){
return i > j ? i : j ;
}
int get_min(int i , int j){
return i < j ? i : j ;
}
int compare(int i , int j , int flag){
int ret ;
//声明指向函数的指针
int (*p)(int ,int);
if(flag == GET_MAX){
p = get_max;//函数名
}else{
p = get_min;
}
ret = p(i , j );
return ret ;
}
int main(){
, j = , ret ;
ret = compare(i , j , GET_MAX);
printf("max = %d\n",ret);
ret = compare(i, j , GET_MIN);
printf("min = %d\n",ret);
}
不能对指向函数的指针做任何运算。
int *f(int i , int j);//返回指针的函数 int (*p)(int i , int j);//指向函数的指针
4.函数指针做形参
函数的参数可以是指针,淡然也可以是指向函数的指针
int get_max(int i , int j,int k , (*p)(int ,int));
该函数接收4个参数,函数内通过指针调用其他函数,信号处理会使用这种技术。
eg:
#include<stdio.h>
int get_big(int i , int j){
return i > j ? i : j ;
}
//get_max函数里有个指向函数的指针做参数
int get_max(int i ,int j ,int k ,int (*p)(int ,int)){
int ret ;
ret = p(i , j );
ret = p(ret , k);
return ret ;
}
int main(){
, j = , k = , ret ;
ret = get_max(i , j , k , get_big);
printf("max = %d",ret);
;
}
5.返回函数指针的函数
eg:
#include<stdio.h>
int get_big(int i , int j){
return i > j ? i : j ;
}
//()优先级高于* , get_function先和()结合,成为一个函数,他的返回值是一个指向函数的指针 int (*)(int ,int)
int (*get_function(int a))(int ,int ){
printf("the number is %d",a);
return get_big;
}
int main(){
, j = , max ;
int (*p)(int ,int);
p = get_function();
max = p(i , j );
printf("max number is %d",max);
;
}
数组名始终指向该数组的第一个元素,不允许做a++运算,新申明的指针则可以随意移动
Linux C 程序 指针数组和二级指针(TEN)的更多相关文章
- C++指针数组,二级指针和函数指针的练习
1.编一程序,将字符串“Hello,C++!”赋给一个字符数组, 然后从第一个字母开始间隔地输出该串(请用指针完成). 代码如下 #include<iostream> #include&l ...
- C/C++——二维数组与指针、指针数组、数组指针(行指针)、二级指针的用法
本文转载自:https://blog.csdn.net/qq_33573235/article/details/79530792 1. 二维数组和指针 要用指针处理二维数组,首先要解决从存储的角度对二 ...
- C++中的指针、数组指针与指针数组、函数指针与指针函数
C++中的指针.数组指针与指针数组.函数指针与指针函数 本文从刚開始学习的人的角度,深入浅出地具体解释什么是指针.怎样使用指针.怎样定义指针.怎样定义数组指针和函数指针.并给出相应的实例演示.接着,差 ...
- 《挑战30天C++入门极限》C/C++中字符指针数组及指向指针的指针的含义
C/C++中字符指针数组及指向指针的指针的含义 就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针. 先看下面的代码,注意看 ...
- OpenCV二维Mat数组(二级指针)在CUDA中的使用
CUDA用于并行计算非常方便,但是GPU与CPU之间的交互,比如传递参数等相对麻烦一些.在写CUDA核函数的时候形参往往会有很多个,动辄达到10-20个,如果能够在CPU中提前把数据组织好,比如使用二 ...
- C语言复习---二维数组和二级指针的关系:没关系,别瞎想(重点)
前提:一维数组和一维指针为什么可以替换使用? ] = { , , }; int *p = a; ; i < ; i++) printf("%d ", *(p + i)); 上 ...
- 二维数组是二级指针pointer to pointer!
二维数组居然是个类似于二级指针(pointer to pointer)的东西,十分震惊! #include <stdio.h> int main() { ][]={{,,,},{,,,}, ...
- C++指针数组和指向指针的指针
指针数组 定义: 如果一个 数组,其元素均为指针型数据,该数组为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址. 形式: 一维指针数组的定义形式为: int[类型名] * ...
- C++数组指针、指针数组、函数指针的核心概念
1.什么叫数组指针? 数组指针:一个指向一维或者多维数组的指针. 比如:int * b=new int[10];指向一维数组的指针b ; 注意,这个时候释放空间一定要delete [] ,否则会造成内 ...
随机推荐
- C++11 新特性之 Lambda表达式
lambda表达式能够用于创建并定义匿名的函数对象,以简化编程工作 Lambda的语法例如以下: [函数对象參数](操作符重载函数參数)->返回值类型{函数体} []内的參数指的是Lambda表 ...
- auto_ptr解析
auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包的智能指针,这个不怎么智能的智能指针难免会黯然失色.诚然 ...
- win7配置nginx + php
nginx的下载地址: http://www.nginx.cn/nginx-download 在nginx下创建文件php-cgi.cmd,并写入内容: "D:\nginx_php-5.6 ...
- php引用详解
<?php function foo($bar){ $bar='111111111'; } $str='2222222222222'; foo($str); echo $str; //out ...
- CentOS5.6 安装RabbitMQ
步骤参考官方地址:http://www.rabbitmq.com/install-rpm.html我们这个版本按照官方的不能正确安装. 1.安装erlang(官网地址http://www.erlang ...
- BloomFilter——读数学之美札记
之前接触过bitmap,读吴军先生的数学之美,看到了一个更强大的数据结构,布隆过滤器(Bloomfilter),赶紧记下来吧,忘了怪可惜的. bitmap的使用是很有局限性的,往往只能用于海量数值型数 ...
- Mac Yosemite OS10.10 Apache 虚拟主机设置
昨天睡觉前开始挂机下载OS10.10 Yosemite,早上6点半就很兴奋地起来安装新系统了.安装完成后打开界面,感觉真的大不一样了,很优很美,很喜欢. 在下载各种更新,体验各种新功能的同时,我也不忘 ...
- [改善Java代码]让多重继承成为现实
建议41: 让多重继承成为现实 在Java中一个类可以多重实现,但不能多重继承,也就是说一个类能够同时实现多个接口,但不能同时继承多个类.但有时候我们确实需要继承多个类,比如希望拥有两个类的行为功能, ...
- [改善Java代码]在明确的场景下,为集合指定初始容量
我们经常使用ArrayList,Vector,Hashmap等集合,一般都是直接用new跟上类名声明出一个集合来,然后使用add,remove,等方法进行操作,而且因为它们是自动管理长度的,所以不用我 ...
- Wince 中的图形编程
图形编程程序当中,笔者主要要和大家讨论的是画刷的创建和使用以及绘图函数,比如2D图像的绘制等等. *画刷的定义: HBRUSH hBrush; *画刷的类型: 1. 系统内置画刷:GetStockOb ...