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 *p;//声明一个指向const int的指针p,p所指向的值不会改变

指针到 const:

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

const 指针到 const:

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

*和[]

例子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[])

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

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

相关推荐

  1. <span style='color:red;'>指针</span>(<span style='color:red;'>2</span>)

    指针(2)

    2024-07-15 22:26:03      20 阅读
  2. 关于指针变量的理解

    2024-07-15 22:26:03       37 阅读
  3. 关于this指向和react vue2 3 的diff--后续补充

    2024-07-15 22:26:03       37 阅读
  4. 关于指针的一次错误调用

    2024-07-15 22:26:03       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 22:26:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 22:26:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 22:26:03       58 阅读
  4. Python语言-面向对象

    2024-07-15 22:26:03       69 阅读

热门阅读

  1. AI艺术革命:使用神经网络生成创新艺术作品

    2024-07-15 22:26:03       19 阅读
  2. JUC练习——线程安全的计数器

    2024-07-15 22:26:03       20 阅读
  3. vue3~

    vue3~

    2024-07-15 22:26:03      18 阅读
  4. QSqlQuery::value: not positioned on a valid record

    2024-07-15 22:26:03       22 阅读
  5. 基于金碟云星空实现硬件ECN校验

    2024-07-15 22:26:03       18 阅读
  6. ObjectiveC 内存管理

    2024-07-15 22:26:03       21 阅读
  7. 7.15作业

    2024-07-15 22:26:03       23 阅读
  8. 【C++】继承与多态相关11道面试题整理

    2024-07-15 22:26:03       20 阅读
  9. .NET Core项目中添加MIME类型

    2024-07-15 22:26:03       21 阅读
  10. 对于RBAC模型的认识

    2024-07-15 22:26:03       20 阅读
  11. 开源项目面临的机遇与挑战

    2024-07-15 22:26:03       20 阅读
  12. 【C++语言】正则表达式

    2024-07-15 22:26:03       20 阅读