【关于C语言中指针的理解】

 

1.什么是指针?

地址:内存单元的编号就是地址。

指针:保存地址的内存单元就是指针。(指针里面的内容就是指向内容的的地址)

注:指针也是有地址编号的。

2.指向地址的变量,就是指针变量。(char* 、int*...............)
3.一级指针与变量的结合
例:

int a = 10;
	int *p =&a;(有取地址符号)
	&a:如果a的地址是0x12345678;
	p:指针变量就是0x12345678;
	*p=10;
	p+1:将指针的的0x12345678+4个字节=0x1234567c(int型是4个字节)

4.一级指针和一维数组的结合
例:
    char a[5]={1,2,3,4,5};
    int *p = a;(a属于常量也是数组的首地址)。
    当进行&a操作时是对整个数组进行取地址&a+1时对整个数组的最后一个成员之后的地址。
    p指向数组的首地址。
    可以对单个元素机型取地址 &a[0]:表示第一个元素的地址也就是首地址。别的元素都如此。
    如果难以理解可以认为a是一个指针。(我的理解)
    a+1就是对整个数组的第二个元素进行地址的指向。可以理解位p+1(两个操作是对等的)。
    不能进行a++操作(a是一个常量,*a++也是错误的:根据优先级会先进行a++操作在进行取*操作,故是错误的)。
    a[i]<=>p[i]<=>*(a+i)<=>*(p+i);
    5.一级指针和二维数组的结合
例:
    int a[][2]={1,2,3,4,5}(可以看为行和列其中列号初始化的过程中必须有,行号可以不写)。
    int *p;
    a:二维数组的名字也是二维数组的首地址,它是一个常量可以看为一个数组指针(int(*p)[2])。
    *a是降维的a[0](int *)。
    a[i][j]=*(a[i]+j)=*(*(a+i)+j)=*(p+i*2+j)
    a+i是+的i行。

6.二级指针和一级指针的地址结合

例:

	int a = 10;
	int *p = &a;
	int **q = &p;
	a=*p=**q=10;
	p+1(指向a后面一个元素的地址移动4个字节)
	p=*q
	q+1(移动了8个字节我们的电脑一般是64位的不管什么类型的指针都是占8字节,32位的指针占4字节)
	

7.数组指针
它是一个行指针,指针指向一个行地址
int(*p)[2];
char(*q)[4];
后边的数字指向列号。
8.指针数组
它是一个数组,里边的每个元素都是指针。
int *p[3];
9.函数指针
它是一个指针,指向一个函数。
int(*a)(int a,int b);//函数名就是函数的地址
例:

#incldue<stdio.h>
	int add(a,b){
		return(a+b);
	}
	int sub(a,b){
		return(a-b);
	}
	int main(){
		int(*a)(int,int);
		a=add;
		printf("%d\n",a(200,300));//500
		a=sub;
		printf("%d\n",a(300,200));//100
		return 0;
	}

10.指针函数
它是一个函数,函数的返回是一个指针。
void *func(void);
char *mygets(char *arr,int n);
11.函数指针数组
它是一个数组,每个元素都是一个函数指针
int(*a[3])(int, int);
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值