C语言学习——指针

1.取地址运算

重新认识“&”:

“&”是C语言中的一个运算符,它能获得变量的地址,并且它的操作数必须是变量

#include
int main()
{
int i;
printf("%P\n",&i);

return 0;
}

要用格式控制符%p来打印变量地址,%p输出的结果一般是一个十六进制的整数,代表指针的值,附加前缀0x。指针的值是一个表示地址空间中某个存储器单元的整数。

数组的地址

#include
int main()
{
int a[10];
printf("%p\n",a);
printf("%p\n",&a);
printf("%p\n",&a[0]);
printf("%p\n",&a[1]);

return 0;
}

结果为:

0061FEF8
0061FEF8
0061FEF8
0061FEFC

综上可知,&a、a、&a[0]代表的地址都是一样的,都是a[0]的地址,且数组内相邻两项的差距为4

2.指针变量

指针:就是保存地址的变量

使用格式 : int i;

                 int *p=&i;   //表示将i的地

址保存到指针变量p中

相关概念:变量的是内存的地址;普通变量的值是实际的值;指针变量的值是具有实际值的变量的地址。

3.作为参数的指针

  • void f(int *p);
  • 在被调用的时候得到了某个变量的地址;
  • int =0;f(&i);
  • 在函数里面可以通过这个指针访问到外面的这个i
#include
void f(int *p);
int main()
{
	int i=6;
	printf("&i=%p\n",&i);
	f(&i);
	
	return 0;
}
void f(int *p)
{
	printf("p=%p\n",p);
}

结果为:

&i=0061FF1C
 p=0061FF1C

4.访问地址上的变量(*)

  • “*”是一个单目运算符,用来访问指针的值所表示的地址上的变量,从而改变这个变量
  • 可以做右值也可以做左值
#include
void f(int *p);
void g(int k);

int main()
{
	int i=6;
	f(&i);
    g(i);

	return 0;
}
void f(int *p)
{
	printf("*p=%d\n",*p);
    *p=25;    
}
void g(int k)
{
    printf("k=%d\n",k);
}

结果为:

*p=6
k=25

*(左值之所以叫左值是因为出现在赋值号左边的不是变量,而是值,是表达式计算的结果:a[0]=2;  *p=3;  是特殊的值,所以叫做左值)

5.指针的实际使用

1.交换两个变量的值

在没有学习指针之前,如果我们想要创建一个函数用来交换两个变量的值是没有办法的,因为本地变量的限制,当我们学习了指针之后就可以完成这一操作,具体代码如下:

#include

void swap(int *pa,int *pb);

void main()
{
    int a=5;
    int b=6;
    return 0;
}

void swap(int *pa,int *pb)
{
    int t=*pa;  //用变量t来暂时存储变量a的地址
    *pa=*pb;
    *pb=t;   //用t将变量a的地址赋给*pb

 使用变量的指针来访问到变量本身就可以摆脱本地变量的限制。

2.函数返回多个值,某些值就只能通过指针返回,传入的参数实际上是需要保存带回的结果的变量。

#include

void minmax(int a[],int len,int *max,int *min);

int main()
{
    int a[]={1,2,3,4,5,6,7,8,9,22,33,44,55,66,99};
    int min,max;
    minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
    printf("min=%d,max=%d\n",min,max);
    
    return 0;
}

void minmax(int a[],int len,int *min,int *max)
{
    int i;
    *min=*max=a[0];
    for(i=1;i*max)
        *max=a[i];
    }
}
        

即输出数组a[]的最大值和最小值。

你可能感兴趣的:(学习,c++,java)