C语言指针

指针变量

  • 变量的值是内存的地址
  • 是具有实际值的变量的地址
  • 与普通变量的不同:普通变量是实际的值
//这是指针变量
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的指针,所以不能被赋值

脑图总结

C语言指针

示例代码

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];
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值