C语言--指针与数组

指针

指针就是地址,地址就是指针,地址是内存单元的编号.
指针变量是存放地址的变量

指针与地址:

    指针有类型,地址没有类型
    地址只是读取的开始,类型是读取到什么位置结束

注意:一般不要给指针赋值为一个int类型的地址,操作系统不允许访问

指针的长度

int * ipoit;
char* arr;
printf("%d",sizeof(ipoint)); // 4
printf("%d",sizeof(arr));    // 4

多级指针

定义一级指针指向i的地址

int i = 100;
int* address1 = &i;

二级指针指向address1的地址

int** address2 = &address1;

三级指针指向address2的地址

int*** address3 = &address2;

四级指针指向三级指针的地址

int**** address4 = &address3;

如下:
这里写图片描述

printf("%#d",***adress4);// 1000H
printf("%d",****adress4);// 100

函数指针

指向函数的指针,有三个部分组成

函数返回值类型   函数指针名称  函数的参数列表
    int       (*fun_p)  (int a,char* t);


int add(int a,int) {
    return a + b;
}

int dec(int a,int b) {
return a - b; 
}

void msg(int(*p)(int a,int b),int m,int n) {
int result = p(m,n);
printf("%d",result);
}

main() {
// 定义函数指针
int (*cadd)(int x,int y);
cadd = add;
//使用函数指针
int result = cadd(99,1);
printf("%d",result);//100

// 类似于Java里面的回调函数
msg(add,10,20);
msg(dec,20,10);
}

数组

数组是一块连续的地址空间

取地址值

数组的地址值与首元素地址一样

    char cArr[] = {'A','B','C'};
    printf("%#x",&cArr); // 0x2000
    printf("%#x",&cArr[0]); // 0x2000
    printf("%#x",&cArr[1]); // 0x2001
    printf("%#x",&cArr+0); // 0x2000  一般不要这么取

下面取与上面等价

    printf("%#x",cArr+0); // 
    printf("%#x",cArr+1); // 
    printf("%#x",cArr+2); // 

int数组

    int iArr[] = {1,2,3};
    printf("%#x",&iArr); // 0x2000
    printf("%#x",&iArr[0]); // 0x2000
    printf("%#x",&iArr[1]); // 0x2004
    printf("%#x",&(iArr+2)); // 0x2008  

    iArr+2:表示移到下一个地址单元,int移4个字节,char移1个字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值