指针变量
- 变量的值是内存的地址
- 是具有实际值的变量的地址
- 与普通变量的不同:普通变量是实际的值
//这是指针变量
int *p
//这是普通变量
int x
运算符&
- 获取变量地址,它的操作数必须是变量
//通过&获取i在内存中的地址
f(&i);
作为参数的指针
void f(int *p)
- 在函数里面可以通过这个指针访问外面的这个i
//在被调用时得到某个变量的地址
int i = 0;
f(&i);
访问地址上的变量
- *是一个单目运算符,用来访问指针上的值所表示的地址上的变量
- 可以做右值也可以做左值
//对地址所表示的变量修改
*p =16;
//访问地址所表示的变量
printf("*p=%d\n",*p);
//可以做右值也可以做左值
int k = *p;
*p = k+1;
指针与数组
- 数组变量是特殊的指针,数组本身表达地址
- 无需用&取地址
int a[10];
int*p=1;
- 但是数组的单元表达是变量,需要用&取地址
a == &a[0]
- []运算符可以对数组做,也可以对指针做
p[0] <==> a[0]
- 数组变量是const的指针,所以不能被赋值
脑图总结
示例代码
Pointer variable
#include <stdio.h>
void f(int *p);
void g(int k);
int main(void){
int i =6;
printf("&i=%p\n",&i);
f(&i);
g(i);
return 0;
}
void f(int *p){
printf(" p=%p\n",p);
printf("*p=%d\n",*p);
*p =16;
}
void g(int k){
printf("k=%d\n",k);
}
Address character&
#include <stdio.h>
int main(void)
{
int i=0;
int p;
int a[10];
printf("%p\n",&a);
printf("%p\n",a);
printf("%p\n",&a[0]);
printf("%p\n",&a[1]);
printf("\n");
p= (int)&i;
printf("%p\n",&i);
printf("%p\n",&p);
printf("0x%x\n",&p);
printf("%p\n",&i);
printf("%lu\n",sizeof(int));
printf("%lu\n",sizeof(&i));
return 0;
}
minmax
#include <stdio.h>
void minmax(int a[], int len, int *min, int *max);
int main(void)
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 16, 17, 21, 55};
int min, max;
printf("main sizeOf(a)=%lu\n", sizeof(a));
minmax(a, sizeof(a) / sizeof(a[0]), &min, &max);
printf("min=%d,max=%d\n", min, max);
int *p = &min;
printf("*p=%d\n", *p);
printf("p[0]=%d\n", p[0]);
printf("*a=%d\n", *a);
return 0;
}
void minmax(int a[], int len, int *min, int *max)
{
int i;
printf("minmax sizeOf(a)=%lu\n", sizeof(a));
*min = *max = a[0];
for (i = 1; i < len; i++)
{
if (a[i] < *min)
{
*min = a[i];
}
if (a[i] > *max)
{
*max = a[i];
}
}
}