C里面,数组指针,不是基本类型。顾名思义,数组指针,是指针,是指向数组的指针;
1.它的基本定义样子是
type (*ptr)[size];
- 这个指针,指向的数组的;
- 这里要注意,要定义数组指针,括号是必须的;如果没有括号,就是一个指针数组了;
2.数组指针的定义和初始化
int array[5] = {10, 20, 30, 40, 50};int (*arrayPtr)[5];
arrayPtr = &array;
- arrayPtr是一个指针,它指向一个包含5个Int的数组;
- 要使用&获取数组的地址,赋值给到数组指针
3、一个二维数值的例子
// Define the structure for the data node
typedef struct DataNode
{int index;char name[256]; // Adjust size as necessarydouble value; // Assuming the value is numericstruct DataNode *prev;struct DataNode *next;
} DataNode;void printNodeData(DataNode *node)
{printf("[%3d,%6.2f,%6s]", node->index, node->value, node->name);
}
void printArray(DataNode (*arr)[4])
{// DataNode(*pRow)[] = &arr[1];for (int i = 0; i < 2; i++){for (int j = 0; j < 4; j++){DataNode node = arr[i][j];printNodeData(&arr[i][j]);}printf("\n");}
}
void testArray()
{DataNode arr[2][4] = {{{1, "Node1", 10.5}, {2, "Node2", 20.5}, {3, "Node3", 30.5}, {4, "Node4", 40.5}},{{5, "Node5", 50.5}, {6, "Node6", 60.5}, {7, "Node7", 70.5}, {8, "Node8", 80.6}}};printArray(arr); //Line 4DataNode(*arrPtr)[4]; //Line 5arrPtr = arr; //LIne 6printArray(arrPtr); //Line 7printNodeData(&arrPtr[0][2]); //Line 8printNodeData(&(arrPtr + 1)[0][3]); //LINE 10 arrPtr++; //Line 11 printNodeData(&(arrPtr)[0][3]); //Line 12//Line 13// printArray(arrPtr); // Line 14printNodeData(arrPtr [0]); // Line 15printNodeData(&(arrPtr)[0][0]); //Line 16
}
- Line 4和Line7的结果是一样的;
- 要注意在line8 中,传入参数,是一个*DataNode,
- Line10 和Line12的结果是一样的。这里要注意arrPtr+1,是这个数组指针的+1,是直接跳过到二维数组的下一行;
- 可以在Debug状态下查看arrPtr的地址变化!
- Line14,是不可以执行的,因为arrPtr增加一行之后,数组只有一行了,函数printArray()是要写成做两行的输出的。如果执行,会有不可知的结果输出。
- 可以考虑一下,LIne 15和Line16有区别么?
其实,还是要清楚指针的基本概念:它是指向一个内存地址的数值!它的增加和减少的位移,是由它的数据类型决定的。