首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏乐行僧的博客

    数组指针指针数组

    一、数组指针 初学C语言的朋友对数组指针指针数组感到迷惑,分不清,包括我自己,其实是对概念的不清晰以及对数组指针这两个概念理解的不够深入,下面谈谈我的理解。 在32位下都是4 sizeof(*p);\\20 指针指向空间的大小,即整个数组的大小 2.先定义数组指针类型,根据类型定义变量 typedef int (*A)[5]; //定义指向元素个数为5,元素类型为 int的数组指针类型A int a[5]; A q = &a;//用类型定义变量 3.直接定义数组指针变量 int a[5] = {1,2,3,4,5}; int (*q)[5] = &a;//q ,这个指针指向.rodata对应的常量字符串 指针数组的应用 完整的main函数原型,int main(int arc,char* argv[],char* envp[]) 其中,两个数组分别保存命令行参数环境变量 为了提高程序执行的效率,C语言不做数组下标的安全性检查。如果进行了检查当数组数据量非常大时候会显著减低程序的效率,在安全性高效率之间,权衡利弊之下。

    1.2K10编辑于 2022-02-24
  • 来自专栏技术分享

    指针(2)--指针数组

    (整个数组的地址和数组首元素的地址是有区别的) 我们还可以通过另一个代码来更好理解第二个例外: 我们发现: &arr[0]&arr[0]+1相差4个字节,arrarr+1 相差4个字节,是因为&arr 但是&arr &arr+1相差40个字节,这就是因为&arr是数组的地址,+1 操作是跳过整个数组的。 2.使用指针访问数组 既然arr是数组的首元素的地址,那么它赋值给p时,其实可以认为p等价于arr。所以arr[i]也就等价于p[i]。 sz1是整个数组元素的个数(因为它是直接打印主函数中的数组元素个数); 而sz2是函数中的数组元素的个数,但这里其实取的只是首元素,也就只有一个了。 函数形参的部分是使用指针变量来接收首元素的地址。 数据类型不同 普通数组的数据类型是普通的类型,但指针数组的数据类型实际上是普通的类型再加上*号,用来表明该数据是指针2.

    26410编辑于 2024-06-18
  • 来自专栏计算机工具

    简单理解数组指针指针数组

    而a就是这样的数组,因而下面是合法的。 p=a; int *p[3]是指针数组。说白了,就是定义了三个指针,分别为p[0],p[1],p[2]。可以将他们单独拿来使用。 int a1,a2,a3; p[0]=&a1; p[1]=&a2; p[2]=&a3; 在理解: 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组 这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。 注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a[i] 这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2] 所以要分别赋值 还需要说明的一点就是,同时用来指向二维数组时,其引用数组名引用都是一样的。

    30310编辑于 2024-12-16
  • 来自专栏C语言入门到精通

    7.6 指针数组多重指针

    一、指针数组 解释:一个数组,若其元素均为指针类型数据,称为指针数组 一般形式 类型名 *数组名[数组长度] 二、指向指针数据的指针 解释:指向指针数据的指针声明的是指针,只是这指针指向另一个指针 例子 三、指针数组作main函数的形参 int mian(int argc,char *argv[]) 其中argcargv就是mian函数的参数,他们是程序的“命令行参数” 命令行的一般形式 命令名 参数 1 参数2 ......参数n 注意:命令名各参数之间用空格分隔开

    5803129发布于 2019-08-09
  • 来自专栏蓝天

    进一步理解指针2:双指针指针数组数组指针

    进一步理解指针2:双指针指针数组数组指针.pdf 1. 概念 1.1. 指针 对于“p + 1”,这里的“1”是啥? 双指针 指向一个指针指针。 1.2. 指针数组指针值组成的数组,也就是说数组的每个元素值的数据类型均为指针类型,如:int* p[2]; 1.3.  数组指针 指向一个数组指针2. 区别 行数 列数 说明 int** p1; 双指针 不固定 不固定 列数行数都不确定,而且每行可以列数不等。 数组指针指针关系图 8.2. 数组指针关系图 8.3.  相关参考 《进一步理解指针:一维数组二维数组转换》: http://blog.chinaunix.net/uid-20682147-id-4967871.html 《常见指针定义解读

    1.7K10发布于 2018-08-10
  • 来自专栏C语言入门到精通

    8.6 指针数组多重指针

    01 什么是指针数组 1、一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。 2、一般形式 类型名 *数组名[数组长度]; 类型中应包括符合*,如int *表示是指向整数数据的指针类型。 3、例子 int *p[4]; 4、由于[]比*优先级高,因此p先[4]结合,形成p[4]形式,这显然是数组形式,表示p数组有4个元素。 然后再p前面的*结合,*表示此数组指针类型的,每个数组元素都可以指向一个整型变量。 02 指向指针数据的指针 1、在了解了指针数组的基础上,需要了解指向指针数据的指针变量,简称指向指针指针2、在某些情况下,main函数可以有参数,例如:int main(int argc,char *argv[])其中,argcargv就是main函数的形参,他们是程序的“命令行参数”。

    5093129发布于 2019-07-12
  • 【C语言】指针进阶2数组指针、函数

    看代码: void test() { printf("hello\n"); } //下面pfun1pfun2哪个有能力存放test函数的地址? pfun1先*结合,说明pfun1是指针指针指向的是一个函数,指向的函数无参 数,返回值类型为void。 那void *pfun2()是什么呢? 那咱们来看看它怎么定义: int (*parr1[10])(); 解释: parr1 先 [] 结合,说明 parr1是数组数组的元素是 int (*)() 类型的函数指针。 三、指向函数指针数组指针 解释: 指向函数指针数组指针是一个指针 指针指向一个数组数组的元素都是函数指针 定义: void test(const char* str) { printf 总结: 回调函数是C语言中解耦灵活性的经典实现方式,它通过函数指针将具体逻辑交给调用者定义。 总结 指针进阶完结。

    18310编辑于 2026-01-13
  • 来自专栏C++

    指针+数组指针+字符指针+指针数组

    ,而前面的 int 是指针变量p 要指向的变量的类型; 例如: #include<stdio.h> int main() { int *p,i;//定义整形指针变量p,普通变量i; p= ,所以*自然就是指针变量的标志了,在定义的同时,指向一个变量,其实就是把定义取地址,合并了起来,这两个代码是等同的; 那接下来我们开始了解通过指针访问变量地址,话不多说上代码: 如图:我将普通变量的地址放在了指针变量 2.当对数组名进行取地址的时候是整个数组的地址。 那整个数组的地址与数组的地址有什么区别呢: 数组的地址vs整个数组的地址 我们来看一段代码: 1. 3.打印的第一行打印的第3行的地址是相同的,说明数组名就是数组首元素的地址,而对数组取地址的这个地址也同样是数组首元素的地址: 结论:二者都是数组首元素的地址,不同的是,步长大小不同; 我们再回到数组指针2.二维数组数组名代表的是一行的一维数组的整个地址,当我们用数组指针指向二维数组时,就直接取二维数组数组名就好啦。

    68910编辑于 2024-11-19
  • 来自专栏同步文章1234

    【进阶指针一】字符数组&数组指针&指针数组

    2-2 误区: 2-3  代码一代码二的异同: 2-4 关于字符常量区: 2-5 一道为了区分栈区字符常量区&&字符数组字符指针的面试题:  3.指针数组 3-1 指针数组长什么样捏? 数组指针 4-1 区分取地址数组名和数组名(老生常谈了) 4-2 辨析数组指针指针数组  4-3 学会了? 来看一个小测试题 4-4  来看一个脱裤子放屁的代码【看一看数组指针的使用】  4-5 这才是数组指针的正确使用方法捏【数组指针模拟打印二维数组】 5 测试题规律总结 测验1: 测验2:那么指针数组指针 2-3  代码一代码二的异同: 1. 同: (1)指针类型:p1p2都是字符指针变量,都是存放的是字符a的地址。 4-2 辨析数组指针指针数组  图图我就省略喽!

    1.4K40编辑于 2023-01-16
  • 来自专栏韩曙亮的移动开发专栏

    【C 语言】数组 ( 数组指针 | 数组指针定义 | 使用 数组指针类型 定义数组指针 )

    typedef 定义一个数组指针类型 , typedef int(*ArrayPointer)[3]; 然后 , 定义一个普通数组 , 之后的 数组指针 指向该数组 , int array2 [3] = {0}; 最后 , 声明一个 数组指针类型 变量 , 将 array2 变量地址赋值给该 数组指针类型 变量 , 指针指向的数据类型为 int[3] 数组类型的变量 array2 ; ArrayPointer p = NULL; p = &array2; 验证上述 定义的数组指针 : 为 数组元素 赋值 , // 为数组赋值 int i = 0; for (i = 0; i < 3; i++) { array2[i] = i + 1; } 使用 数组指针 , 打印数组元素内容 : // 使用 数组指针 访问数组中的值 int array2[3] = {0}; // 最后 , 声明一个 数组指针类型 变量 // 将 array2 变量地址赋值给该 数组指针类型 变量 // 指针指向的数据类型为

    4.4K10编辑于 2023-03-29
  • 来自专栏技术之路

    指针数组数组指针

    指针数组 :就是指针数组数组的元素是指针;  数组指针:就是指向数组指针。 简单举例说明:     int *p1[10];    声明了一个数组数组的元素是int型的指针。     int (*p2)[10]; 声明了一个指针, 指向了一个有十个int元素的数组。 这两种写法主要是因为运算符的优先级, 因为[]的优先级比*高。 第一种写法:p先[]结合,所以是一个数组,后与*结合,是指针数组。 第二种写法:()的优先级比[]高,*号p2构成一个指针的定义,指针变量名为p,int 修饰的是数组的内容,即数组的每个元素。 数组在这里并没有名字,是个匿名数组,           那现在我们清楚p 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针 ? int a[3]={1,2,3}; int (*p)[3]=&a;//指向3个int型数组元素的数组指针 int* p2[3]; //存贮3个int型变量地址 for(int i=0;i<3

    1.4K90发布于 2018-01-31
  • 来自专栏从零开始学 Web 前端

    数组指针的区别

    下面的摘取的例子特别具有说明性: 以后再也不敢说指针数组一样啦!

    76440发布于 2018-08-31
  • 来自专栏C语言入门到精通

    8.6 C语言指针数组多重指针

    01什么是指针数组 1、一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。 2、一般形式 类型名 *数组名[数组长度]; 类型中应包括符合*,如int *表示是指向整数数据的指针类型。 3、例子 int *p[4]; 4、由于[]比*优先级高,因此p先[4]结合,形成p[4]形式,这显然是数组形式,表示p数组有4个元素。 然后再p前面的*结合,*表示此数组指针类型的,每个数组元素都可以指向一个整型变量。 02指向指针数据的指针 1、在了解了指针数组的基础上,需要了解指向指针数据的指针变量,简称指向指针指针2、在某些情况下,main函数可以有参数,例如:int main(int argc,char *argv[])其中,argcargv就是main函数的形参,他们是程序的“命令行参数”。

    1.3K2825发布于 2020-12-08
  • 来自专栏cs阿伟

    【C】数组指针练习

    一、数组笔试题解析 知识点: 只要是地址就是4/8个字节  数组数组名是数组首元素的地址 但是有2个例外: 1. sizeof(数组名) - 数组名表示整个数组,计算的是整个数组的大小 &数组名 - 数组名也表示整个数组,取出的是整个数组的地址 除了这个2个例外,你见到的所有的数组名都表示首元素的地址  sizeof sizeof 是计算对象或者类型创建的对象所占内存空间的大小 strlen(&arr + 1));     printf("%d\n", strlen(&arr[0] + 1));     return 0; }  题目解析及运行结果: ----  题目三:指针变量 n",sizeof(*(&a[0]+1))); printf("%d\n",sizeof(*a)); printf("%d\n",sizeof(a[3])); 题目解析及运行结果: ---- 二、指针笔试题 ,可以参考之前关于指针进阶的博文。

    39450编辑于 2023-10-10
  • 来自专栏全栈程序员必看

    函数指针函数指针数组及其应用

    函数指针其类似,只不过其指向的不是一个变量,而是一个函数,仅此而已。话不多说,看个例子。 简单的5行代码就完成了一个简单的函数指针。我们一行行来看。 第一行。声明了一个函数指针。其普通指针有啥区别。我放在一起让大家看一下。 void (*funcPointer)(double x);//函数指针 void *pointer;//普通指针 看出来了么。函数指针无非多了两个括号一个参数列表。想想也是。 所以说函数指针是个很好用的东西。 2. 函数指针数组 函数指针说完了。我们接下来来看看函数指针数组。 多了俩字。数组。前面四个字还一样。那是不是就是有一个数组,用它来盛放函数指针。 好了,相信讲到这里,大家应该清楚的明白什么是函数指针函数指针数组了。

    1.1K10编辑于 2022-09-14
  • 来自专栏韩曙亮的移动开发专栏

    【C 语言】指针数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    多维数组 多维指针 1. 多维数组 多维指针 1. 类型, 编译时会报错 ; 2.数组参数限制 : ( 1 ) 一维数组 : 可以不带数组长度, 但是必须指定数组的大小 ; ( 2 ) 二维数组 : 数组 第一维 长度可以不带 ( 即 数组指针 _2d 是一个完整的数组指针, 该指针中包含着 其指向的数组的 类型 大小 ( 3 ) 数组指针退化时, 退化的只是 array_2d 的 数组指针 数组 (最外层的一维数组) 大小, 其每个元素都是一个 数组指针, 这个数组指针 包含 数组类型 大小, 没有退化 */ int column = sizeof(*array_2d) / sizeof(*array_2d[0]);

    4.6K30编辑于 2023-03-27
  • 来自专栏EdisonTalk

    你必须知道的指针基础-2.指针的声明使用及数组指针的关系

    n",i1); // 取iPtr指针指向的内存中的数据   (2)使用   可以使用*取指针指向的内存数据,如上面代码中的 i1 = *iPtr。 三、数组指针 3.1 一块连续的内存区域   我们经常听说:数组在内存中是一块连续的内存区域,那么来验证一下,声明一个数组,并依此输出其内存地址: int nums[] = {33,55,66,77,88 3.2 指针如何指向数组   在开发中一般使用第二种方式,即数组元素的名字即是数组第0个元素的内存地址。 int* iptr1 = &(nums[0]); //获取第0个元素的内存地址 int* iptr2 = nums; //一般这样用,数组元素的名字就是“第0个元素的内存地址” 3.3 字符串即字符数组 =%c\n",*str2);   可以看到,使用指针str2指向了str1的第0个元素的地址,输出结果验证了一致性: ?

    1.3K20发布于 2018-08-20
  • 来自专栏韩曙亮的移动开发专栏

    【C 语言】数组 ( 数组指针 | 数组指针定义 | 直接定义 数组指针 )

    之后的 数组指针 指向该数组 , int array2[3] = {0}; 然后 , 直接定义数组类型变量 , int (*p)[3] = NULL; 最后 , 将 array2 变量地址赋值给该 数组指针类型 变量 , 指针指向的数据类型为 int[3] 数组类型的变量 array2 ; ArrayPointer p = NULL; p = &array2; 验证上述 定义的数组指针 , 之后的 数组指针 指向该数组 int array2[3] = {0}; // 然后 , 直接定义数组类型变量 int (*p)[3] = NULL; // 最后 , 将 array2 变量地址赋值给该 数组指针类型 变量 // 指针指向的数据类型为 int[3] 数组类型的变量 array2 p = &array2; // 为数组赋值 int i = 0; for(i = 0; i < 3; i++) { array2[i] = i + 1; } // 使用 数组指针 访问数组中的值

    4.3K20编辑于 2023-03-29
  • 来自专栏C++核心编程

    CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

    指针指针指针:定义了一个指针变量,如果没有进行初始化,系统就会有可能随机赋值一个地址给这个指针变量,也就是说,这个指向指向一个未知的区域。 指针数组数组指针 引入 int *b可以用来定义数组(详见指针数组定义字符串的区别文章) int a = [1,2,3,4,5]; int *b = a; char (*b)[5]用来指向数组 char 指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。 还需要说明的一点就是,同时用来指向二维数组时,其引用数组名引用都是一样的。 ()”的优先级比“[]”高,“*”号p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。 数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针

    2.3K30编辑于 2023-03-21
  • 来自专栏C++核心编程

    CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

    指针指针指针:定义了一个指针变量,如果没有进行初始化,系统就会有可能随机赋值一个地址给这个指针变量,也就是说,这个指向指向一个未知的区域。 指针数组数组指针 int *b可以用来定义数组 int a = [1,2,3,4,5]; int *b = a; int (*b)[5]用来指向数组 int a = [1,2,3,4,5]; int 还需要说明的一点就是,同时用来指向二维数组时,其引用数组名引用都是一样的。 号p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。 数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针

    2.3K20编辑于 2022-10-04
领券