指针是什么?
看一下下面的代码和结果,大概清楚指针的一些内容
#include <stdio.h>
int main(void)
{
int a = 1;
int *p = &a;
printf("整型变量a的值是%d\n", a);
printf("指针变量p的值是%x\n", p);
printf("整型变量a的地址是%x\n", &a);
printf("指针变量p的地址是%x\n", &p);
return 0;
}
结果为下值
所以从结果可得:
1). 变量的初始化
指针变量p与整型变量a都需要首先被声明,然后赋予一个初值。代码中,整型变量a的初值是1,指针变量p的初值是变量a的地址。
2). 变量的类型
在定义指针变量p和整型变量a时,都需要指出它们的类型。
整型变量a的类型是int,指针变量p的类型也是int。
整型变量a的int是指变量a不是字符型,不是浮点型,而是一个整型;
指针变量p的int不是说变量p是一个整型变量,而是说p指向的值,本代码中是变量a,是一个整型。
在变量的类型概念方面,指针变量与基本数据变量有差异。
3). 变量的值
本代码中,整型变量a在定义时给予一个初值是1,1就是变量a的值;
指针变量p在定义时也被给予一个初值,这个初值是变量a的地址,变量a的地址就是变量p的值。从运行结果上一眼就能看出来。
4). 变量的地址
整型变量a有自己的地址,指针变量p也有自己的地址。
从本代码运行的结果来看,整型变量a的地址是0x12ff44,指针变量p的地址是0x12ff40。
*p就是通过p所对应的地址指向地址的值
p就是代表一个地址
指针是用于存放另一个变量的内存地址的变量,用&取地址,用*取值。
- 指针赋值一定要用取地址符&,不能直接赋值内存地址。
int ex = 8; int * ptr_ex = &ex; 等价于
int ex = 8; int * ptr_ex; ptr_ex = &ex;
- 使用指针修改变量值。
- ptr_ex = 888;
- 存放指针的地址。
int ** ptr_ex2 = &ptr_ex;
- 使用指针表示一维数组a第i个元素。【int * ptr_a = a】
地址&a[i]: a + i / ptr_a + i
值a[i]/ptr_a[i]: * (a + i)/ * (ptr_a + i)
- 使用指针表示二维数组aa第i行第j列元素。【int (* ptr_aa)[列数] = aa】
------先行后列------
值aa[i][j]/ptr_aa[i][j]: *(aa[i] + j) / *(ptr_aa[i] + j) / ((aa + i) + j) / ((ptr_aa + i) + j)
-
%p:指针占位符(内存地址大写),%x:十六进制占位符(内存地址小写),
-
两者本质无差别,都是打印出内存地址。两者本质无差别,都是打印出内存地址。
-
值的引用传递。
在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
如下:
int p
p = *p1;
*p1 = *p2;
*p2 = *p;
*p + 1和 *(p+1)的区别
int a[]={2,4,6,8};
int *p = (int *)&a;
*p + 1 = 3
*(p + 1) = 4
因为的优先级比+的优先级高,所以P+1在编译器中是先取出p指向的int值然后加1,就是a[0]+1,也就是2+1,所以p+1取出的值等于2。(P+1),因为多了一个括号,所以就变成指针P+1后,再取出里面的值,也就是a[1]的中的值,所以*(P+1)取出的值等于4。
指针与函数的应用
#include <stdio.h>
int table[10];
void lookup(int *t,int *a,int n)
{ int k;
*a=t[0];
for(k=1;k<n;k++)
if(*a > t[k] )
*a=t[k];
}
void main()
{ int k,min,*p=&min;
for (k=0;k<10;k++)
scanf("%d",table+k);
lookup(table ,p ,10);
printf("min=%d\n",min);
}
通过改变*p指向的值来得到该数组中的最小值。