2-17,18,19 -- 关于指针

指针(pointer

声明指针

int *p;

定义指针

int a = 4;
int *p = &a; //指针p是指向变量a的地址的指针

指针数组

int *arr[5];

数组指针

int (*arr)[5];

函数指针

int (*fun)(int,int) // 声明一个指向函数的指针,这个函数的返回值是int,有两个int的参数

指针的指针

int **p;

const限定词

const指针

int a = 5;

const int *p;//声明一个指向const int的指针p,p所指向的值不会改变

(*p) ++; //error

&p = a; //right

指针到 const:

int a = 5;

int *const p = &a;//const p表示指针p所指向的地址无法改变,但可以改变它所指向的值

(*p) ++; //right

&p = a; //error

const 指针到 const:

int a = 5;

int b = 6;

const int *const p = &a;//p 是一个指向 const int 的指针,且 p 的地址不能改变

(*p) ++; //error

&p = a; //error

*和[]

例子1:

18.1.c

#include<stdio.h>
int main(){
	int arr[6] = {0};
	arr[3] = 4;
	printf("%d\n",arr[3]);
	*(arr + 3) = 6;
	printf("%d\n",*(arr + 3));	
	return 0;
}


在这里插入图片描述
经过上面的例子,可以看到*和[]都可以获取数组的数值

例子2:

将*(arr + 3) = 6;赋值操作删除,看看能不能用arr[3],*(arr + 3)两种方式取得同一个数值

#include<stdio.h>
int main(){
	int arr[6] = {0};
	arr[3] = 4;
	printf("%d\n",arr[3]);
	printf("%d\n",*(arr + 3));	
	return 0;
}

在这里插入图片描述
例子2告诉我们arr[3],和*(arr + 3)在获取数值是等价的。

指针的值

int a = 4;
int *p = &4;
int b = 5;
p = &b;

指针也是一个变量,有自己的值,而这个值存储的是其它变量或函数的地址
在这里插入图片描述

而p所在的内存地址是我们无法修改的,正如我们无法修改a的内存地址,事实上任何变量或函数的内存地址我们都无法直接修改,那也不是我们应该干的。

数组参数的类型 – 指针

#include <stdio.h>

void fun() {
    printf("sizeof(a): %zu\n", sizeof(a));// %zu是
}

int main(void) {
    int array[10];
    printf("sizeof(array): %zu\n", sizeof(array));
    fun(array);
    return 0;
}

问1:上述代码的输出结果是多少呢?

答1:

40
8

sizeof(array)判断的是数组的长度,int型数组有十个元素,自然是40B
在x86-64的操作系统上
对于int a[]参数,sizeof(a)输出8,是因为一个指针占8B

二维数组的内存分配

int (*arr)[2][5];

假设arr[0][0]在内存中的地址是X
arr[1][3]在内存中的地址是X+45+34,(X+32)
arr[i][j]在内存中的地址是X+4arr[0].size()i+4j,(X+4arr[0].size()i+4j)

指针的指针与二位数组

看一下这两者有何区别

char **argv;
char* argv[];

在c中,main函数可以这样写

int main(int grac,int **argv)

也可以这样写

int main(int grac,int *argv[])

在函数参数中,两者是等价的

注:诸位站友如有所收获不如点个免费的赞,如有错误之处或有其它补充的点,请在评论区发表你的观点,看到必回。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值