Cprogramming 简明教程
Initialization of Pointer Arrays in C
pointer 是一个变量,可存储另一个变量的地址。指针变量的名称必须带有前缀“*”符号。正如普通变量一样,我们还可以声明“指针数组”,其中数组的每个下标都保存数组类型的地址。
How to Initialize Array of Pointers in C?
指针变量可以在声明时通过给它分配现有变量的地址来初始化。以下片段显示如何初始化指针 −
int x = 10;
int *y = &x;
默认情况下,所有 variables (包括指针变量)都属于“auto 存储类”。这意味着指针变量将存储不可预测的垃圾、随机内存地址,这可能导致未定义的行为以及程序的潜在风险,例如段错误。因此,如果我们在声明时没有特定的值要存储,则应将其初始化为 NULL。
int *ptr = NULL;
“指针数组”存储每个元素中的地址。数组的类型必须与目标变量的类型匹配。
Initialize Array of Pointers Using static Keyword
您还可以使用 static keyword 来初始化一个 array of pointers ,在每个下标中存储“0”。
Initialize Array of Integer Pointers
在此,我们声明一个整数指针数组,并存储三个整数变量的地址。
Example
#include <stdio.h>
int main(){
int a = 10, b = 20, c = 30;
int *ptr[3] = {&a, &b, &c};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
运行代码并检查其输出:
ptr[0]: address: 6422040 value: 10
ptr[1]: address: 6422036 value: 20
ptr[2]: address: 6422032 value: 30
Initialize Array of Pointer by Direct Addresses
我们可以将普通数组中每个元素的地址存储在指针数组的相应元素中。
Example
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr[3] = {&arr[0], &arr[1], &arr[2]};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
运行代码并检查其输出:
ptr[0]: address: 6422032 value: 10
ptr[1]: address: 6422036 value: 20
ptr[2]: address: 6422040 value: 30
Traversing an Array with its Base Address
当我们获得数组的基址(在本例中为“&arr[0]”)时,我们可以获得其后续元素的地址,知道指针会以数据类型的大小递增。
因此,只需使用基地址(数组的名称与第 0 个元素的地址相同),我们就可以遍历数组。
Example 1
请看以下示例:
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr=arr;
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i,ptr+i, *(ptr+i));
}
return 0;
}
运行代码并检查其输出:
ptr[0]: address: 6422020 value: 10
ptr[1]: address: 6422024 value: 20
ptr[2]: address: 6422028 value: 30
Example 2: Traversing a 2D Array using a Pointer Array
在此示例中,我们有一个 2D array 。每行的第 0 个元素的地址存储在指针数组中。遍历时,存储在指针数组的每个元素中的地址指向相应行的第 0 个元素,每个元素都会递增以获取每行中的值。
#include <stdio.h>
int main(){
// 2d array
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// pointer
int (*ptr)[4] = arr;
// print the element of the array via pointer ptr
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%d ", *(ptr[i]+j));
}
printf("\n");
}
return 0;
}
当你运行这段代码时,它将产生以下输出:
1 2 3 4
5 6 7 8
Example 3
我们这里实际上并不需要指针数组,因为我们可以将此 2D 数组的名称用作它的基指针,并按行和按列递增它来获取给定 2D 数组中的元素 −
#include <stdio.h>
int main(){
// 2d array
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// pointer
int *ptr = arr;
// print the element of the array via pointer ptr
for (i = 0; i < ROWS; i++){
for (j = 0; j < COLS; j++){
printf("%d ", *(ptr + i * COLS + j));
}
printf("\n");
}
return 0;
}
输出类似于上一段代码 −
1 2 3 4
5 6 7 8
Initialize Array of Character Pointers (String)
在 C 编程中,字符串是一个 char 数据类型数组。由于数组的名称也表示其第 0 个元素的地址,因此可以将字符串声明为 −
char arr[] = "Hello";
使用指针表示法,将字符串分配给 char 指针,如下所示 −
char *arr = "Hello";
然后我们可以声明一个 char 指针数组以存储多个 strings ,如下所示 −
char *arr[3] = {"string1", "string2", "string3", . . . };
Example
以下示例有一个 char pointers 数组,用于存储计算机语言的名称 −
#include <stdio.h>
int main(){
char *langs [10] = {
"PYTHON", "JAVASCRIPT", "PHP",
"NODE JS", "HTML", "KOTLIN", "C++",
"REACT JS", "RUST", "VBSCRIPT"
};
for(int i = 0; i < 10; i++)
printf("%s\n", langs[i]);
return 0;
}
当你运行这段代码时,它将产生以下输出:
PYTHON
JAVASCRIPT
PHP
NODE JS
HTML
KOTLIN
C++
REACT JS
RUST
VBSCRIPT
在此程序中,“ langs ”是一个包含 10 个字符串的 pointer to an array 。因此,如果“langs[0]”指向地址 5000,则“langs + 1”将指向地址 5004,该地址存储指向第二个字符串的指针。
因此,我们还可以使用以下循环变体来打印字符串数组 −
for (int i = 0; i < 10; i++){
printf("%s\n", *(langs + i));
}
Initialization of Dynamic Array of Pointers
你可以使用 malloc() function 以动态方式声明和初始化一个指针数组。
Example
请看以下示例:
#include <stdio.h>
int main(){
int *arr = (int *)malloc (sizeof (int) * 5);
for(int i = 0; i < 5; i++){
arr[i] = i;
}
for (int x = 0; x < 5; x++){
printf("%d %d\n", x, arr[x]);
}
return 0;
}
当你运行这段代码时,它将产生以下输出:
0 0
1 1
2 2
3 3
4 4
您甚至可以要求 user input 并将值分配给指针数组中的元素 −
for(i = 0; i < 5; i++){
scanf("%d", &x);
arr[i] = x;
}