指针与数组&&指针与函数

来源:互联网 发布: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;}



0 0