C中的指针,阵列和字符串
#编程 #c #指针

介绍

指针是一个变量,其值是另一个变量的地址,即内存位置的直接地址。每个变量都是内存位置,每个内存位置都有其定义的地址,可以使用ampersand(&)运算符访问该地址,该操作员表示内存中的地址。

#include <stdio.h>

int main () {

   int  variable1;
   char variable2[10];

   printf("Address of var1 variable: %x\n", &variable1);
   printf("Address of var2 variable: %x\n", &variable2);

   return 0;
}

Address of var1 variable: bff5a400
Address of var2 variable: bff5a3f6

字符串是一种数据类型,该数据类型将字符序列存储在数组中。 C中的字符串总是以null字符(\ 0)结尾,该字符表示字符串的终止


char c[] = "abcd";

char c[50] = "abcd";

char c[] = {'a', 'b', 'c', 'd', '\0'};

char c[5] = {'a', 'b', 'c', 'd', '\0'};

一个数组定义为存储在连续内存位置的类似数据项的集合。数组是C编程语言中的派生数据类型,可以存储原始数据,例如INT,CHAR,Double,Float等。它还具有存储派生数据类型的集合,例如指针,结构,结构,等。

#include<stdio.h>  
int main(){      
int i=0;    
int marks[5]={20,30,40,50,60};//declaration and initialization of array    
 //traversal of array    
for(i=0;i<5;i++){      
printf("%d \n",marks[i]);    
}    
return 0;  
}    
20
30
40
50
60

什么是字符串的指针

指针包含我们需要的特定变量的地址。一系列指针存储了数组的所有元素的地址和一系列字符串指针存储数组中存在的字符串的地址。数组包含数组中每个字符串元素的基础地址。

这是一个说明这一点的示例:

char *arr[]={
            "Big",
            "black ",
            "Heavy",
            "Nice",
            "ball"
          };

使用2D数组的字符串数组:
众所周知,数组是类似数据类型的集合以及存储在连续存储器位置中的所有数据。因此,在这种情况下,每个字符都将放置在连续的内存位置。示例

char arr[ROW][COL]; //2d array of character

2DArray

这意味着如果我们创建一个2D数组,那么我们必须创建一个具有至少等于最长字符串的列计数的数组,并且会导致较小值的数组元素中的大量空间浪费。<<<<<<<<<<<< /p>

字符串数组使用指针到字符串的数组:

类似于2D数组,我们可以使用指针到字符串来创建字符串数组。基本上,此数组是一个字符指针的数组,每个指针都指向字符串的第一个字符。
语法

char *arr[ROW]; //array of pointer to string


c

array of pointer to string:

基于您要表示字符串数组的方式,您可以定义一个指针以从数组中访问字符串。让我们查看一些示例代码,

**

1.)使用指针到数组的指针访问2D字符数组

**
要访问字符串数组,我们需要创建一个指向数组的指针,并使用数组初始化指针。现在使用for循环您可以读取数组的所有字符串。

指向1D数组的指针:

#include<stdio.h>
int main()
{
    int row =0;
    //create 2d array of the characters
    char * arr[5] = {"Cloud1", "Cloud1Cloud1", "Cloud1Cloud1Cloud1", "Cloud1Cloud1Cloud1Cloud1", "Cloud1Cloud1Cloud1Cloud1"};
    //create pointer to the array
    char * (*ptrArr)[5] = NULL;
    //initialize the pointer
    ptrArr = &arr;
    for (row = 0; row < 5; ++row)// Loop for coloumb
    {
        printf("%s \n", (*ptrArr)[row]);
    }
    return 0;
}

输出:

/tmp/wY4tusyiIu.o
Cloud1 
Cloud1Cloud1 
Cloud1Cloud1Cloud1 
Cloud1Cloud1Cloud1Cloud1 
Cloud1Cloud1Cloud1Cloud1

指向2D数组的指针

#include<stdio.h>
int main()
{
    int row =0;
    //create 2d array of the characters
    char arr[5][10] = {"Coding", "Coding", "Coding", "Coding", "Coding"};
    //create pointer to the 2d array
    char (*ptrArr)[5][10] = NULL;
    //initialize the pointer
    ptrArr = &arr;
    for (row = 0; row < 5; ++row)// Loop for coloumb
    {
        printf("%s \n", (*ptrArr)[row]);
    }
    return 0;
}

输出:

/tmp/wY4tusyiIu.o
Coding 
Coding 
Coding 
Coding 
Coding 

**指针指向指针**

#include<stdio.h>
int main()
{
    int row =0;
    //create 2d array of the characters
    char * arr[5] = {"pointer2pointer", "pointer2pointer", "pointer2pointer", "pointer2pointer", "pointer2pointer"};
    //create pointer to the array
    char **ptr = NULL;
    //initialize the pointer with array
    ptr = arr;
    for (row = 0; row < 5; ++row)// Loop for coloumb
    {
        printf("   %s \n", ptr[row]);
    }
    return 0;
}

输出:

/tmp/wY4tusyiIu.o
pointer2pointer 
   pointer2pointer 
   pointer2pointer 
   pointer2pointer 
   pointer2pointer

字符串指针数组的优点

  • 它在内存中占据较小的空间:与字符串数组相比,字符串的一系列指针占据较少的空间。这意味着有效地使用内存空间,因为如果我们创建一个2D数组,那么我们必须创建一个具有至少等于最长字符串的列计数的数组,并且会导致数组元素中的大量空间浪费,具有较小的值。

  • 操纵字符串:串起的一系列指针可以更轻松地操纵字符串并在字符串上执行不同的操作。