指向数组的指针
指向数组的指针也是一个指针,和之前的指针不同的是它指向的是一个数组。这样可以像指针那样访问数组,通过指向数组的指针访问数组,在操作指针的时候和之前的指针不一样。
先看一个数组
int a[] = {1, 2, 3, 4, 5, 6};
在访问数组元素的时候,通常是通过数组变量加上元素下标来访问,如a[i], i=0,1,2,3,...,n。a表示分配给数组的一块连续内存空间的起始地址,所以也可以像指针那样访问,如*(a+i), i=0,1,2,3,...n。
int *p = a;
这里将a直接赋值给指针p,所以也可以像指针那样访问,如*(p+i), i=0,1,2,3,...n。。这和之前的没什么不一样。
int (*p)[6] = &a;
这里的p也是一个指针,这个指针和之前的指针就不一样了。
int a[][6] =
{{1, 2, 3, 4, 5, 6},
{11,12,13,14,15,16},
{21,22,23,24,25,26},
{31,32,33,34,35,36},
{41,42,43,44,45,46},
{51,52,53,54,55,56}};
int (*p)[6] = a;
int (*p)[6][6] = &a;
先看如下代码:
函数matrix_from_n原型为:
int matrix_from_n(matrix *matrix, int n, int** data);
函数matrix_from_n的第3个参数为int **类型。但在调用matrix_from_n函数的时候传的是int matrix_data[][6]。
int matrix_data[][6] = {{0, 50, 75, 80, 0, 30}, {50, 0, 35, 0, 0, 0}, {75, 35, 0, 40, 0, 90}, {80, 0, 40, 0, 45, 60}, { 0, 0, 0, 45, 0, 15}, {30, 0, 90, 60, 15, 0}}; matrix_from_n(&matrix, 6, matrix_data);
上述代码会提示一个警告:
warning: passing argument 3 of ‘matrix_from_n’ from incompatible pointer type
note: expected ‘int **’ but argument is of type ‘int (*)[6]’
也就是虽然matrix_data定义的是int matrix_data[][6]类型,但是在传递的时候其实是int (*)[6]类型,这也是一种指针类型,它是一个指向一维数组的指针类型,具体点应该是指向6个元素的一维数组的指针类型。虽然也是指针类型,但和int **也是不一样的。
将上述代码改为如下:
int matrix_data[][6] = {{0, 50, 75, 80, 0, 30}, {50, 0, 35, 0, 0, 0}, {75, 35, 0, 40, 0, 90}, {80, 0, 40, 0, 45, 60}, { 0, 0, 0, 45, 0, 15}, {30, 0, 90, 60, 15, 0}}; int (*p)[6] = matrix_data; matrix_from_n(&matrix, 6, p);
这段代码其实和上面的代码是一样的,同样会提示上面的警告:
warning: passing argument 3 of ‘matrix_from_n’ from incompatible pointer type
note: expected ‘int **’ but argument is of type ‘int (*)[6]’
继续,将上述代码改为如下:
int matrix_data[][6] = {{0, 50, 75, 80, 0, 30}, {50, 0, 35, 0, 0, 0}, {75, 35, 0, 40, 0, 90}, {80, 0, 40, 0, 45, 60}, { 0, 0, 0, 45, 0, 15}, {30, 0, 90, 60, 15, 0}}; int **p = matrix_data; matrix_from_n(&matrix, 6, p);
因为要求的是int **类型,所以这里将matrix_data赋值给int **类型的指针:int **p = matrix_data;但在这个地方也会提示警告。在int **p = matrix_data;处提示如下:
warning: initialization from incompatible pointer type
这里其实就是试图将int (*)[6]类型转换为int **类型。问题本质上和上面的一样。
所以
int matrix_data[][6]
这个数组类型定义除了按照数组的方式访问,如果按照指针的方式去访问的话,matrix_data其实是一个指向6个元素的一维数组的指针类型,其定义形式为:int (*matrix_data)[6]。
继续,将上述代码改为如下:
int matrix_data[] = { 0, 50, 75, 80, 0, 30, 50, 0, 35, 0, 0, 0, 75, 35, 0, 40, 0, 90, 80, 0, 40, 0, 45, 60, 0, 0, 0, 45, 0, 15, 30, 0, 90, 60, 15, 0}; matrix_from_n(&matrix, 6, matrix_data);
提示如下:
warning: passing argument 3 of ‘matrix_from_n’ from incompatible pointer type
note: expected ‘int **’ but argument is of type ‘int *’
也就是现在将matrix_data定义为int matrix_data[]类型,但是在传递的时候其实是int *类型,也就是matrix_data按照指针的方式访问的话其实是int *类型。
继续,将上述代码改为如下:
int matrix_data[] = { 0, 50, 75, 80, 0, 30, 50, 0, 35, 0, 0, 0, 75, 35, 0, 40, 0, 90, 80, 0, 40, 0, 45, 60, 0, 0, 0, 45, 0, 15, 30, 0, 90, 60, 15, 0}; matrix_from_n(&matrix, 6, &matrix_data);
提示如下:
warning: passing argument 3 of ‘matrix_from_n’ from incompatible pointer type
note: expected ‘int **’ but argument is of type ‘int (*)[36]’
也就是现在将matrix_data定义为int matrix_data[]类型,但是在传递的时候传的是&matrix_data,&matrix_data其实是int (*)[36]类型,其实是一个指向36个元素的一维数组的指针类型,其定义形式为:int (*matrix_data)[36]。
int (*p)[6];
这是一个指向6个元素的一维数组的指针。
例子:
int matrix_data[][6]
int (*matrix_data_p)[6] = matrix_data;
另外:
int matrix_data[] = {...}
如果按照指针的方式去访问的话,如果是直接matrix_data,其定义形式为:int *matrix_data。如果是&matrix_data,其实是一个指向一维数组的指针类型,其定义形式为:int (*matrix_data)[N], N为{...}中实际指定的元素的个数。
int matrix_data[6];
int *matrix_data_p1 = matrix_data;
int (*matrix_data_p2)[6] = &matrix_data;
相关推荐
数组指针是指向数组第一个元素的指针。它可以用来访问和操作数组中的元素。定义数组指针的方式是在类型标识符后面加上一个星号(*)和一个指向运算符(&)。例如,int (*ptr)[5]表示一个指向包含5个整型元素的数组的指针...
通过指针引用数组元素如果指针变量p指向数组中的一个元素,则p+1指向同一数组中的下一个元素。 2 指针与数组 如果p的初始值为&a[0],则: p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i个元素。 *(p+i)或*(a+i)...
总结:数组相当于C语言中的指向数组的指针, 数据的初始化有二种形式工:定义是赋值,或初始化(NEW运算后)赋值二种形式。 数据也是对象。 数组的copy; 如:int a[]=new int[10]; int b[]=new int[10]; ...
将若干字符串按字母顺序(由小到大)输出。 解题思路:定义一个指针数组,用各字符串对它进行初始化,然后排序,但不是移动字符串,而是改变指针数组的各元素的指向。 文件里面代码实现。
指针数组和数组指针。 int* intPtrArray[5]; // 创建一个包含 5 个整数指针的指针数组 int a = 10, b = 20, c = 30, d = 40, e = 50; intPtrArray[0] = &a; // 第一个元素指向整数变量... // 第五个元素指向整数变量 e
1、数组名是第一个元素的地址; 2、指针保存的是另一个对象的地址... 5、无法使用string对象初始化char指针,但是string类提供了一个名为c_str的成员函数,以实现此要求; 6、可以使用指向char数组的指针,构
8.1 指针是什么 8.2 指针变量 8.3 通过指针引用数组 8.4 通过指针引用字符串 8.5 指向函数的指针 8.6 返回指针值的函数 8.7 指针数组和多重指针 8.8 动态内存分配与指向它的指针变量 8.9 有关指针的小结
第十一章 指针 11.1 理解指针 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元。为了正确访问内存单元,必须为每个内存单元编号,根据一个内存的编号即可准确找到该内存...
以类型int[][]声明一个叫matrix的二维数组变量,将矩阵初始化为一个5个元素的数组。 以下列方式为matrix的内部元素赋值:matrix从零开始循环到其长度值;例如索引为i,在每次迭代中,将matrix[i]指向一个新的整数数...
int *p[3]与int (*p)[3]的区别*p[3]这个是一个指针数组,它所代表的意思是数组中的每一个元素都是一个指针变量,而(*p)[3],p是一个指针变量,表示指向一个含有3个整型元素的一维数组。 代码如下:int i,j; int a[2]...
学会使用数组的指针和指向数组的指针变量; 3. 学会使用字符串的指针和指向字符串的指针变量; 4. 学会使用指向函数的指针变量; 5. 了解指向指针的指针的概念及其使用方法 【实验仪器】 计算机 【实验步骤与内容】...
由丁类型的长度是一个宇节,所以,原来是指向数组的第号单元开始的四个字节,此时指向了数组中从第 号单元开始的四个字。 我们可以用一个指针和一个循环来遍历一个数组,看例子: 此处略去为整型数组赋值的代码。 这个例...
第5章 数组 5.1 一维数组 5.1.1 一维数组定义及数组元素引用 5.1.2 数组元素的引用方法 5.1.3 一维数组的初始化 5.1.4 一维数组元素的查找与排序 5.1.5 数组与函数 5.2 字符串 5.2.1 字符数组与字符...
CSU 大一上 C语言实验报告 (1)教材第2章编程题第2题:编写计算球体体积的程序。...(25)教材第17章编程题第5题:用指针数组存储键入的字符串,对数组排序。 说明:本题应用动态分配内存、数组排序,考查综合能力。
使用指针访问数组元素,可以通过将指针指向数组的第一个元素,然后使用指针的递增运算符(++)依次访问数组的每个元素。例如:int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; printf("%d", *p); // 输出1 printf("%d...
如果使指针p,指向数组的首元素,可以进行操作:int * p=a;或者int *p=&a[0];那么p++,是指向数组中的先一个元素,即a[1];此时*p则是a[1]中所放的值。此时,a[i]=p[i]=*(a+i)=*(p+i)下面举一个例子;直接用a[i]来...
32) C语言之指向数组的指针 33) C语言之保护数组内容const的使用 34) C语言之指向多维数组的指针 函数 35) C语言之函数的定义和调用 36) C语言之定义带参数的函数 37) C语言之函数之形参和实参 38) C语言之函数之...
可以将指针指向数组的任意元素,然后从那里开始访问,只要注意不越界就行了,这说明数组只是将元素连续堆叠,并不需要也没有其他的配置信息存放在数组元素之外的地方或者在头尾等等任何地方,都没有,他只是连续的...
根据YANN LECUN的论文《Gradient-based Learning Applied To Document Recognition》设计的LeNet-5神经网络,C语言写成,不依赖任何第三方库。 MNIST手写字符集初代训练识别率97%,多代训练识别率98%。 DEMO main.c...