指针数组,也称字符串数组

//
//  main.c
//  C语言学习

#include <stdio.h>


int main(int argc, const char * argv[]) {
   
    //指针数组,也称字符串数组
    
    /*
    char str1[] = "abc";
    char str2[] = "def";
    char str3[] = "xyz";
    
    char strs[3][20] = {"abc","def","xyz"};
    */
    
    char *str1 = "abc";
    char *str2 = "def";
    char *str3 = "xyz";
    
    //定义数组的格式:元素类型 数组名称[元素个数]
//    int a = 10;
//    int b = 20;
//    int nums[2] = {10,20};
    
    char *names[3] = {"abc","def","xyz"};
    
    for (int i=0; i<3; i++) {
        printf("names[%i] = %s\n",i,names[i]);
    }
    /*
     names[0] = abc
     names[1] = def
     names[2] = xyz
     */
    
    return 0;
}

<think>好的,我现在要解答用户关于C语言指针数组如何赋值字符串的问题。首先,我需要回顾指针数组的基本概念。指针数组是一个数组,其元素都是指针。例如,char *names[5]就是一个指针数组,每个元素都是指向字符的指针,也就是字符串。 接下来,用户想知道如何给这样的指针数组赋值字符串。根据引用[1]中的示例,可以看到直接使用字符串字面量进行初始化是可行的,比如const char *names[] = {"Zhang San", "Li Si", ...};。这里每个字符串字面量都是存储在只读内存区的,所以指针数组的元素指向这些常量字符串的地址。 但是,如果用户想要在程序运行时动态赋值,就需要考虑内存分配的问题。例如,使用malloc或者strdup来为每个字符串分配内存空间,然后将指针数组的元素指向这些新分配的内存。引用[5]中的示例代码展示了如何通过函数动态输入字符串,并存储到指针数组中,这里使用了malloc来分配内存,并在最后释放内存以避免泄漏。 还需要注意字符串的存储位置。直接赋值字符串字面量时,这些字符串是不可修改的,而如果使用字符数组存储字符串,则内容可以修改。引用[3]提到,字符串数组字符串指针数组的区别在于指针是否可变。因此,在动态赋值时,必须确保内存的正确分配和释放,避免悬空指针或内存泄漏。 另外,引用[2]和[4]解释了指针数组的类型和定义方式,比如int *[3]表示一个包含3个指向int的指针数组。同样地,char *[5]是包含5个指向char的指针数组,每个指针可以指向一个字符串的首字符。 总结一下,给指针数组赋值字符串的方法有两种:静态初始化和动态分配。静态初始化适用于已知字符串的情况,直接使用字符串字面量即可。动态分配则需要在运行时为每个字符串分配内存,并将指针数组元素指向这些内存地址。同时,需要注意字符串的存储位置和内存管理,避免程序错误。</think>### C语言指针数组赋值字符串的规则与示例 #### 一、指针数组定义 指针数组是**元素均为指针数组**。例如,`char *names[5]` 表示一个包含5个字符指针数组,每个指针可指向一个字符串的首地址。 --- #### 二、赋值规则 1. **静态初始化** 直接使用字符串字面量初始化指针数组字符串存储在**常量区**(不可修改): ```c const char *names[] = {"Zhang San", "Li Si", "Wang Wu"}; //正确[^1] ``` 2. **动态赋值** 需通过内存分配函数(如 `malloc` 或 `strdup`)为字符串分配空间,并将指针存入数组: ```c char *arr[3]; arr[0] = strdup("Hello"); //需手动释放内存[^5] arr[1] = (char *)malloc(10 * sizeof(char)); strcpy(arr[1], "World"); //动态赋值示例 ``` 3. **禁止直接赋值未分配内存的指针** ```c char *arr[3]; arr[0] = "Alice"; //合法(指向常量区) arr[1] = malloc(10); scanf("%s", arr[1]); //合法(动态内存) arr[2] = {'H','i'}; //非法!需通过地址赋值 ``` --- #### 三、操作示例 **示例1:静态初始化与遍历** ```c #include <stdio.h> int main() { const char *colors[] = {"Red", "Green", "Blue"}; //常量区字符串[^1] for(int i=0; i<3; i++) { printf("%s\n", colors[i]); //输出指针指向的字符串 } return 0; } ``` **示例2:动态内存分配** ```c #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *words[2]; words[0] = (char *)malloc(20 * sizeof(char)); strcpy(words[0], "Dynamic"); //复制到堆内存 words[1] = strdup("Allocation"); //strdup自动分配内存[^5] for(int i=0; i<2; i++) { printf("%s\n", words[i]); free(words[i]); //必须释放内存 } return 0; } ``` --- #### 四、核心注意事项 1. **内存生命周期** 静态初始化的字符串无需手动释放,动态分配的内存必须用 `free()` 释放。 2. **修改权限** 常量区字符串不可修改,否则引发段错误: ```c const char *str = "ABC"; str[0] = 'a'; //错误!常量区禁止写入 ``` 3. **指针类型匹配** 数组元素必须为 `char *` 类型,指向合法的字符串地址。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值