指针与地址、函数参数的关系

    技术2022-07-11  85

    1. 基本概念 指针是保存变量地址的变量。 指针存在的两个目的: 1)指针是表达某个计算的唯一途径; 2)使用指针可以生成更高效、更紧凑的代码。 通常情况,机器的一个字节可以存放一个char类型数据,两个相邻的字节存储单元可存储一个short(短整型)类型的数据,而四个相邻的字节存储单元可以存储一个long(长整型)类型的数据。 2. 指针与地址 每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。先看一个案例:

    #include <stdio.h> #include <stdlib.h> int main () { int var1; /*变量*/ char var2[10]; /*数组变量*/ printf("var1 变量的地址: %p\n", &var1 ); printf("var2 变量的地址: %p\n", &var2 ); system("pause"); return 0; }

    仿真结果为: 上述案例,我们知道每一个变量都存放在一个地址中,如var1的类型是int,假设p是指向var1的指针,则:

    p=&c;

    上述代码的意思是,把var1的地址赋值给变量p,称p为指向var1的指针。也就是说,指针p其实是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。官方申明方式为:

    int *p /*一个整型的指针*/

    运算符*称间接寻址或间接引用运算符,是用来指定一个变量是指针,当它作用于指针时,将访问指针所指向的对象。 举个栗子,例1:

    #include <stdio.h> #include <stdlib.h> int main () { int var1 = 20; /* 实际变量的声明 */ int *p; /* 指针变量的声明 */ p = &var1; /* 在指针变量中存储 var1 的地址 */ printf("变量var1的地址为: %p\n", &var1 ); printf("指针变量p存储的地址为: %p\n", p ); /* 使用指针访问值 */ printf("*p的值为: %d\n", *p );/*访问以变量p的值为地址的变量,及var1的值*/ system("pause"); return 0; }

    仿真结果为: 举个栗子,例2:

    int x=1, y=2, z[10]; int *ip; // ip是指向int类型的指针 // ip = &x; // ip指向x,将变量x的地址赋值给变量ip // y = *ip; // *ip表示取地址为变量ip值里的变量,即变量x,并将其赋值给y,因此,y值为1 // *ip = 0// 将0赋值给地址为变量ip值里的变量,即x值赋值为0 // ip =&z[0]; // ip指向z[0] //

    举个栗子,例2:

    double *dp, atof(char *); //*dp和atof(char *)的值都是double类型,且atof的参数是一个指向char类型的指针//

    3. 指针与函数参数 C语言是以传递的方式将参数值传递给被调用函数,因此,被调用函数不能直接修改主调函数中的变量值。 举个栗子,例3:

    //*****函数一*****// //描述:交换两个入口参数的值(错误的方法,因为该函数仅仅交换了a和b的副本的值) //入口参数:int x和int y //返回值:无 void swap1(int x, int y) { int temp1; //申明变量temp1// temp1 = x; //将变量x的值赋值给变量temp1// x = y; //将变量y的值赋值给变量x// y = temp1; //将变量temp1的值赋值给变量y// } //*****函数二*****// //描述:交换两个入口参数的值(正确的方法) //入口参数:int *px和int *py //返回值:无 void swap2(int *px, int *py) //*px是指向int类型的指针,指向以px值为地址的变量// { int temp2; //申明变量temp2// temp2 = *px; //将以px值为地址的变量赋值给temp2// *px = *py; //将以py值为地址的变量赋值给以px值为地址的变量// *py = temp2; //将变量temp2的值赋值给以py为地址的变量// } //*****主函数*****// int main(void) { int a=1; //定义变量a的值为1// int b=2; //定义变量b的值为2// swap1(a,b); printf("a的值为%d,b的值为%d\n", a,b); swap2(&a, &b); //&a为变量a的地址,&b为变量b的地址// printf("a的值为%d,b的值为%d\n", a,b); system("pause"); }

    运行结果:

    Processed: 0.011, SQL: 9