指针与数组&&指针与函数
来源:互联网 发布:python 字典 key 变量 编辑:程序博客网 时间:2024/06/05 00:09
int arr[]={100,120,130,150};int *ptr=arr;//int *ptr;ptr=arr size=sizeof arr/sizeof(arr[0]);
表示地址的有:arr 表示一维数组首元素地址。
arr+i ,&arr[i],ptr+i 第i个元素地址
表示元素的有: arr[i] *arr[i] ptr[i] *(ptr+i)
指针其实就是一个地址,而数组名,表示第一个元素的地址,也可以看为指针。凡是用数组名表示的都可以用指向数组的指针表示。为了与指针变量区别,数组名称为指针常量。指针变量与指针常量的区别是,前者可以使用递增递减运算符(++,--),不能使用arr++或arr--。
当指针,++或--,以及*这3个运算符同时出现时,要注意++或—的作用点在哪里,区分是地址加1还是地址指向的内容加1. *和++的运算优先级相同,且其结合行是由右至左。
/* 指针与一维数组*/
#include <stdio.h>
#include <conio.h>
int main()
{
int i[] = {100, 200, 300,400, 500};
int *pi = i;
printf("...%d\n",*pi++); //由右至左结合,*pi++=*(pi++) 先取内容输出100,再pi由指向a[0]变为指向a[1]
printf("*pi =%d\n", *pi); // 此时pi指向的是i[1] 输出200
printf("...%d\n",*++pi); //*++pi=*(++pi)且是前置++,指针先指向下一个,再取内容 300
printf("*pi =%d\n", *pi); // 300
printf("...%d\n",++*pi); //++(*pi) 等效*p = *p+ 1
printf("*pi =%d\n", *pi); //301
getch();
return 0;
}
指针与二维数组(二维数组名是二级指针)
一维数组的元素值,可使用[]或一个*得到如arr[2],*(arr+2);而二维数组则需要两个*,或一个*一个[],或两个[];
int j[2][3] = {0,1,2,3,4,5};
j 是数组名称,表示数组第1行第1列元素的地址,j+1是第2行第1列元素的地址;j[0]和j[1]等同于j和j+1,表示第1行第1列元素和第2行第1列元素的地址,但是两者对于加一个单位的意思不同。
j+1==&j[1][0] (向行偏移),而j[0]+1==&j[0][1] (向列偏移)
在一维数组里,j和*(j+1)是某个元素的值,但是,在二维数组里,表示是某个元素的地址。j和*j都表示&j[0][0], j+1和*(j+1)都表示&j[1][0]. 但是两者对于加一个单位的意思也不同。
*j+1==&j[0][1] *(j+1)+1==&j[1][1]
如下图所示,方格中所写为对应数组元素的地址
j *j j[0]
j[0]+1 *j+1
j+1 *(j+1) j[1]
*(j+1)+1
将二维数组j[M][N]看成M个一维数组jj[N]组成。可以看到,在二维数组里,j等同于*j(下一部分解释)
k[x][y] = *(k[x]+y)== *(*(k+x)+y)
数组指针
数组指针表示数组的元素,都是指向某个数据类型的指针
如:char *parr[4] = {"Department","of", "Information", "Management"};
parr是4个元素组成的数组,数组中的每个元素都是指向char数据类型的指针,注意不是赋值,而是将各个字符串的地址赋给数组,指针指向各个字符串。
/* 数组指针 */#include <stdio.h>#include <stdlib.h>int main(){char *parr[] = {"Department", "of", "Information", "Management"};printf("*parr[3] = %c\n", *parr[3]);printf("**(parr+3) = %c\n", **(parr+3));printf("parr[3][0] = %c\n", parr[3][0]);printf("parr[2] = %s\n", parr[2]);printf("*(parr+2) = %s\n", *(parr+2));system("PAUSE");return 0;}
在二维数组j[][]中,为什么等同于*j。
因为一个指针相当于一维数组,所以上述数组指针可以改写为如下语句
char j[4][12] = {"Department", "of","Information", "Management"};
j为数组名,所以Department字符串中‘D’的地址就是&[0][0],而以数组指针表示时,也是指向字符‘D’的。
指向数组的指针
(*ptr)[4]是指向数组的指针,表示ptr是一个指针,指向一个有4个元素的数组
函数指针将函数名设置给一个指针,当要使用哪个函数,只要将指针指向该函数即可。
区别:int *pf(int) ----指针函数 表示pf是一个函数,该函数有一个参数是int类型,且会返回一个指向int类型的指针
int (*pf)(int)----函数指针 pf是指向某一个函数的指针,最后该函数将返回一个int值
如下为函数指针的应用,程序中有4个函数分别处理加减乘除,同时也声明一个函数指针,当要处理加法时,将add赋值给operation.....
#include <stdio.h>#include <conio.h>int add(int, int);int substract(int, int);int multiply(int, int);int divide(int, int);int (*operation)(int, int); //声明函数指针int main(){int x, y, output;printf("请输入 x 与 y: ");scanf("%d %d", &x, &y);operation = add; //指针指向函数output = (*operation)(x, y);printf("%d + %d = %d\n", x, y, output);operation = substract;output = (*operation)(x, y);printf("%d - %d = %d\n", x, y, output);operation = multiply;output = (*operation)(x, y);printf("%d * %d = %d\n", x, y, output);operation = divide;output = (*operation)(x, y);printf("%d / %d = %d\n", x, y, output); getch();return 0;}int add(int a, int b){return a+b;}int substract(int a, int b){return a-b;}int multiply(int a, int b){return a*b;}int divide(int a, int b){return a/b;}
- 函数指针、指针数组与数组指针
- 数组指针与指针数组 函数指针与指针函数
- 数组指针与指针数组 函数指针与指针函数
- 指针数组与数组指针、指针函数与函数指针
- 函数指针与指针函数、数组指针与指针数组
- 数组指针与函数指针
- 数组指针与函数指针
- 数组、指针与函数指针
- 指针数组、数组指针与指针函数、函数指针
- 指针函数与函数指针,指针数组及数组指针
- 指针函数与函数指针数组指针指针数组
- 数组,函数与指针
- 函数 数组与指针
- 指针与数组,指针与函数
- 指针与数组&&指针与函数
- 指针与数组与函数
- 指针函数与函数指针数组
- 函数指针与函数的数组指针
- SqlServer事务中的可重复读和序列化隔离界别
- (beginer) UVA IDA* 10422 - Knights in FEN
- mac 安装 nginx 环境
- 基于内容的视频信息检索系统
- IOS-访问HTTP和HTTPS
- 指针与数组&&指针与函数
- [简要笔记]数学之美
- 找出较大的下一个数字组合 Next Permutation
- 字符串匹配经典算法
- 100天坚持行动---相约4月19号
- sudo
- 存储properties资源文件
- rj45接口定义/rj45针脚定义/rj45引脚定义
- 【IOS学习】之九、Blocks的实现续