指针进阶

表示形式含义地址
a二维数组名,指向一维数组a[0],即0行首地址2000
a[0],*(a+0),*a0行0列元素地址2000
a+1,&a[1]1行首地址2016
a[1],*(a+1)1行0列元素a[1][0]的地址2016
a[1]+2,*(a+1)+2,a[1][2]1行2列元素a[1][2]2024
* (a[1]+2),((a+1)+2),a[1][2]1行2列元素a[1][2]2024

函数自增自减

int arr[]={1,2,3,4};
int *a=arr;
*a++;//自增运算符优先级高于解引用,此时值为1,即先给a地址自增1,然后对自增前的a取值,将自增a的地址传出
*++a;//a的地址自增1,进行解引用,值为2
++*a;//这两运算符都是自右向左运算,即先解引用,然后在取出的值进行自增1
自减也一样

自增运算符只能使用在指针类型,数组类型的数组名是地址,但是不可以使用自增运算符
指针自增地址增加的值
int iarr[] = {1,2,3,4,5,6};
int* p = iarr;
for(int i=0;i<5;++i){
printf("%p\n",p++);
}
}在这里插入图片描述
指针自增即增加的是数组类型的字节大小

指针大小

无论指向什么类型,所有指针的大小都是一样的( 64位是8个字节,32位是4个字节 ),都是地址的大小。

char* str;
short* ps;
int* pn;
long* pl;
long long* pll;
float* pf;
double* pd;
long double* pld;

指针类型转换
指针类型转换没有改变指针内的地址,也没有改变指针指向的值,只是改变了移动的单位长度。

#include <stdio.h>
int main(){
    char* str = "abcdef";
    int* p=(int*)str;
    p++;
    char* q = (char*)p;
    printf("%c\n",*q);//执行后为  e,因为p自增时的类型是int,所以增加4个字节
}

void类型的指针
void*是一种很特别的指针,表示指向未知类型的指针,并不指定它是指向哪一种类型的数据,而是根据需要转换为所需数据类型。

int n = 0;
int* p = &n;
void* q = p;
int* k = (int*) q;
指针数组和数组指针

数组指针
指向一个数组的指针称为数组指针

int n = 0;
int* p = &n;
int arr[] = {1,2,3,4,5,6};
int* q = arr;

指针数组
数组里面存储的是数据的地址

#include <stdio.h>

int main(){
    int a = 1;
    int b = 2;
    int c = 3;
    int* p[] = {&a,&b,&c};
    for(int i=0;i<3;++i){
        printf("%d\n",*p[i]);
    }
    for(int i=0;i<3;++i){
        printf("%d\n",**(p+i));
    }
}	

指针常量和常量指针
指针常量 int * const p
p是int*类型,那么const修饰的是p,所以p是常量,表示p指向的地址不可修改,即p不能再指向别的地方了,但是可以修改p指向的这个地址里的值。

int a = 10;
int b = 20;
int * const p = &a;
p = &b;      // 错误
*p = 100;    // 允许

常量指针 const int * p (int const * p)
可以写作int const p,p是int类型,const修饰的是p,所以p是常量,表示p指向的地址里的值不可修改,也就是说,p里的值不能再重新赋值了,但是可以修改p指向的地址。

int a = 10;
int b = 20;
const int *p = &a;
p = &b;      // 可以
*p = 100;    // 错误

常量指针常量 const int * const p
p是int类型,两个const分别修饰了p和p, 所以p和*p都是常量,表示p指向的地址不可修改,同时p指向的地址里的值也不可修改。

int a = 10;
int b = 20;
const int *const p = &a;
p = &b;       // 错误
*p = 100;     // 错误

*之前的const修饰指向的变量,*之后的const修饰指针。

No.例子名称指向的值地址
1const int *p/int const *p常量指针不可改变可改变
2int* const p指针常量可改变不可改变
3const int * const p常量指针常量不可改变不可改变

0地址

#include <stdio.h>

int main(){
    int *p = 0;
    printf("%d\n",*p);
}

0地址是内存中不能访问的地址。在C语言中,标准库定义NULL表示0地址。
通常用来表示如下:
针没有初始化
返回指针无效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值