C语言详细讲解指针数组的用法

目录
  • 1. 指针数组定义方法
  • 2. 指针的指针(二级指针)
  • 3. 字符串和指针
  • 4. 数组指针
    • 定义方法
    • 数组指针的用法

1. 指针数组定义方法

格式:

类型说明符 *数组名[ 元素个数 ]

int *p[10]; // 定义了一个整型指针数组p,有10个元素,都是int *类型的变量

指针数组的分类: 同指针类型的分类,见上一篇

大多数情况下,指针数组都用来保存多个字符串。

#include <stdio.h>
int main()
{
    char *name[5] = {"Hello",
                     "Pig",
                     "Pk",
                     "Welcome",
                     "DJANGo"};
    int i;
    for (i = 0; i < 5; i++)
    {
        printf("%s\n", name[i]);
    }
    return 0;
}

2. 指针的指针(二级指针)

指针的指针,即指针的地址

int main()
{
    int a = 100;
    //定义一个一级指针,用于保存变量的地址
    int *p = &a;
    //定义一个二级指针,用于保存一级指针的地址
    int **q = &p;
    printf("a = %d %d %d\n", a, *p, **q);
    printf("&a = %p %p %p\n", &a, p, *q);  // 打印a的地址
    return 0;
}

3. 字符串和指针

字符串的概念:以 ‘\0’ 结尾的若干字符的集合

字符串的存储形式:数组,字符串指针,堆

(1) char string[100] = “I LOVE C” 定义了一个字符数组string用来存放字符串

(2) char *str = “I LOVE C” 定义了一个指针变量str,只能存放字符地址编号,所以说I LOVE C这个字符串中的字符不能存放在str指针变量中。str只是存放了字符 I 的地址编号,I LOVE C 存放在文字常量区

(3)char str=(char)malloc(10*sizeof(char)); 动态申请了10个字节的存储空间,首地址给str赋值。strcpy(str,“I LOVE C!”);  将字符串拷贝到str指向的内存里。 《strcpy()函数详解》

用的最多的是(1)和(3)

总结:

字符数组:在内存(栈、静态全局区)中开辟了一段空间存放字符串

字符串指针:在文字常量区开辟了一段空间存放字符串,将字符串的首地址赋给str

堆:使用malloc函数在堆区申请空间,将字符串拷贝到堆区

4. 数组指针

本身是一个指针,指向一个数组,加1跳一个数组,即指向下一个数组。

数组指针的作用就是可以保存二维数组的首地址。

定义方法

格式:

指向的数组的类型 (*指针变量名)[ 指向的数组的元素个数 ]

int (*p)[5]; //定义了一个数组指针变量p,p指向的是整型的有5个元素的数组

p+1 往下指5个整型,跳过一个有5个整型元素的数组。

#include <stdio.h>
// 定义数组指针
void test1()
{
    int a[3][5]; // 定义一个3行5列的数组
    int(*p)[5];  // 定义了一个数组指针变量p,p+1跳一个有5个元素的整型数组
    printf("a=%p\n", a);      // 第0行的行地址
    printf("a+1=%p\n", a + 1); // 第1行的行地址,a和a+1差20个字节
    p = a;
    printf("p=%p\n", p);
    printf("p+1=%p\n", p + 1);
    return;
}
int main()
{
    test1();
    return 0;
}

数组指针的用法

#include <stdio.h>
// 数组指针的用法:可以将二维数组的首地址传到另一个函数里面,此时函数的形参需要定义为数组指针
void func(int (*p)[5], int x, int y)
{
    p[x][y] = 101;
}
void test2()
{
    int i, j;
    int a[3][5];
    func(a, 0, 1);
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    test2();
    return 0;
}

到此这篇关于C语言详细讲解指针数组的用法的文章就介绍到这了,更多相关C语言指针数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言零基础讲解指针和数组

    目录 一.指针和数组分析-上 1.数组的本质 2.指针的运算 3.指针的比较 4.小结 二.指针与数组分析-下 1.数组的访问方式 2.下标形式 VS 指针形式 3.a 和 &a 的区别 4.数组参数 5.小结 一.指针和数组分析-上 1.数组的本质 数组是一段连续的内存空间 数组的空间大小为 sizeof(array_type) * array_size 数组名可看做指向数组第一个元素的常量指针 下面看一段代码: #include <stdio.h> int main() { int

  • C语言 从根本上理解数组

    目录 一.数组的概念 二.数组的大小 三.数组地址与数组名 四.数组名的盲点 五.小结 一.数组的概念 数组是相同类型的变量的有序集合 二.数组的大小 数组在一片连续的内存空间中存储元素 数组元素的个数可以显示或隐式指定 下面看一段数组初始化的代码: #include <stdio.h> int main() { int a[5] = {1, 2}; int b[] = {1, 2}; printf("a[2] = %d\n", a[2]); printf("a[

  • C语言从基础到进阶全面讲解数组

    目录 1.基础知识 2.数组的分类 2.1按元素类型分类 2.2按维数分类 3.数组定义和初始化 3.1 一维数组 3.2 二维数组 4.数组元素的引用方法 5.字符数组的定义 1.基础知识 C语言中使用数组表示多个连续的同类型的存储位置 使用数组表示多个连续存储位置的时候只需要一个名字,这个名字代表所有这些存储位置的整体 每一个存储位置有一个自己的编号,最前边的存储位置的编号是0,向后依次递增,最后一个存储位置的编号是个数减一,这个编号叫做下标 决不可以使用超过范围的下标 使用名称和下标就可以

  • C语言数组全面详细讲解

    目录 1.基础知识 2.数组的分类 2.1按元素类型分类 2.2按维数分类 3.数组定义和初始化 3.1 一维数组 3.2 二维数组 4.数组元素的引用方法 5.字符数组的定义 1.基础知识 C语言中使用数组表示多个连续的同类型的存储位置 使用数组表示多个连续存储位置的时候只需要一个名字,这个名字代表所有这些存储位置的整体 每一个存储位置有一个自己的编号,最前边的存储位置的编号是0,向后依次递增,最后一个存储位置的编号是个数减一,这个编号叫做下标 决不可以使用超过范围的下标 使用名称和下标就可以

  • C语言数组的各种操作梳理

    目录 一.一维数组 1.创建 2.初始化 3.使用 4.数组在内存中的存储 5.数组大小的计算 二.二维数组 1.创建 2.初始化 3.使用 4.二维数组在内存中的存储 三.数组作为函数参数 1.关于数组名是数组首元素的地址的两个例外 2.冒泡排序 一.一维数组 1.创建 //如何创建数组 int num[10]; char arr[10]; double sum[10]; float fix[10]; //变长数组 //数组的大小是变量 //C99语法支持 int a = 10; int ar

  • C语言数组实现打砖块游戏

    本文实例为大家分享了C语言数组实现打砖块游戏的具体代码,供大家参考,具体内容如下 这次我们使用数组来改进打砖块游戏. 反弹的球 首先我们实现一个可以在荧幕上反弹的小球.使用二维数组 int canvas[High][Width] ( 和js的canvas没有一毛钱关系)来储存画布上的所有元素,值为0时输出空格,值为1时输出小球. 设小球坐标为(ball_x, ball_y),则有canvas[ball_x][ball_y] = 1 ,且暂时将其他元素的值设为0. 每次更新小球位置时将原位置元素设

  • C语言三种方法解决轮转数组问题

    目录 题目 1.题目描述 2.要求 3.原题链接 二.相关知识点 三.解决思路 旋转法 直接法 空间换取时间 题目 1.题目描述 给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数. 示例 1: 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4] 2.要求 进阶

  • C语言数组快速入门详细讲解

    目录 1.一维数组 a.一维数组的创建 b.一维数组的初始化 c.一维数组的使用 d.一维数组在内存中的存储 2.二维数组 a.二维数组的创建 b.二维数组的初始化 c.二维数组的使用 d.二维数组在内存中的存储 3.数组越界 4.数组作为函数参数 5.数组名 1.一维数组 数组的定义: 数组是一组相同类型元素的集合 a.一维数组的创建 数组的创建格式为: 数组的类型 数组名[ 常量表达式] : 关于数组创建易错点: b.一维数组的初始化 类似于给整型变量初始化的过程: int a=2; int

  • C语言用数组实现反弹球消砖块

    本文项目为大家分享了C语言用数组实现反弹球消砖块的具体代码,供大家参考,具体内容如下 一.效果展示: 二.代码如下: #include<stdio.h> #include<string.h> #include<conio.h> #include<Windows.h> #include<time.h> #define High 24   //游戏画面尺寸 #define Width 36 //全局变量 int ball_x,ball_y;//小球的

  • C语言详细讲解指针数组的用法

    目录 1. 指针数组定义方法 2. 指针的指针(二级指针) 3. 字符串和指针 4. 数组指针 定义方法 数组指针的用法 1. 指针数组定义方法 格式: 类型说明符 *数组名[ 元素个数 ] int *p[10]; // 定义了一个整型指针数组p,有10个元素,都是int *类型的变量 指针数组的分类: 同指针类型的分类,见上一篇 大多数情况下,指针数组都用来保存多个字符串. #include <stdio.h> int main() { char *name[5] = {"Hell

  • C语言详细讲解while语句的用法

    目录 while语句格式 例题1 例题2 例题3 while语句格式 格式: while(表达式){    语句块} 1.先执行while(表达式),如条件为真执行语句块: 2.执行完语句块,继续执行表达式: 3.知道表达式为假.就退出循环,执行while后面的代码. 例题1 用while语句,输出0-9的值. 代码: #include <stdio.h> int main (void) { int i=0; //初始条件i=0; while(i<10) //while 循环 //whi

  • C语言详细讲解多维数组与多维指针

    目录 一.指向指针的指针 二.二维数组与二维指针 三.数组名 四.小结 一.指向指针的指针 指针的本质是变量 指针会占用一定的内存空间 可以定义指针的指针来保存指针变量的地址值 为什么需要指向指针的指针? 指针在本质上也是变量 对于指针也同样存在传值调用与传址调用 下面看一个重置动态空间大小(从 size 到 new_size)的代码: #include <stdio.h> #include <malloc.h> int reset(char** p, int size, int

  • C语言 详细讲解数组参数与指针参数

    目录 一.C语言中的数组参数退化为指针的意义 二.二维数组参数 三.等价关系 四.被忽视的知识点 五.小结 一.C语言中的数组参数退化为指针的意义 C 语言中只会以值拷贝的方式传递参数 当向函数传递数组时: 将整个数组拷贝一份传入函数        × 将数组名看做常量指针传数组首元素地址    √ C 语言以高效作为最初设计目标: a) 参数传递的时候如果拷贝整个数组执行效率将大大下降. b) 参数位于栈上,太大的数组拷贝将导致栈溢出. 二.二维数组参数 二维数组参数同样存在退化的问题 二维数

  • C语言超详细讲解轮转数组

    目录 题目描述 实例 解题思路 1. 先整体逆转 2.逆转子数组[0, k - 1] 3.逆转子数组[k, numsSize - 1] 易错点 代码 题目描述 给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数.OJ链接 实例 1.实例1 输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7

  • C语言全方位讲解指针与地址和数组函数堆空间的关系

    目录 一.一种特殊的变量-指针 二.深入理解指针与地址 三.指针与数组(上) 四.指针与数组(下) 五.指针与函数 六.指针与堆空间 七.指针专题经典问题剖析 一.一种特殊的变量-指针 指针是C语言中的变量 因为是变量,所以用于保存具体值 特殊之处,指针保存的值是内存中的地址 内存地址是什么? 内存是计算机中的存储部件,每个存储单元有固定唯一的编号 内存中存储单元的编号即内存地址 需要弄清楚的事实 程序中的一切元素都存在于内存中,因此,可通过内存地址访问程序元素. 内存示例 获取地址 C语言中通

  • C语言详细讲解二分查找用法

    目录 [力扣题号]704.二分查找 力扣题目链接 示例 1: 输入: nums = [-1,0,3,5,9,12], target = 9     输出: 4       解释: 9 出现在 nums 中并且下标为 4 示例 2: 输入: nums = [-1,0,3,5,9,12], target = 2     输出: -1        解释: 2 不存在 nums 中因此返回 -1 提示: 你可以假设 nums中的所有元素是不重复的. n将在[1, 10000]之间. nums的每个元素

  • C语言超详细讲解指针的概念与使用

    目录 一.指针与一维数组 1. 指针与数组基础 2. 指针与数组 3. 一个思考 二.指针与字符串 三.指针和二维数组 1. 指针数组与数组指针 2. 指针数组 3. 数组指针 一.指针与一维数组 1. 指针与数组基础 先说明几点干货: 1. 数组是变量的集合,并且数组中的多个变量在内存空间上是连续存储的. 2. 数组名是数组的入口地址,同时也是首元素的地址,数组名是一个地址常量,不能更改. 3. 数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的其实地址. 对于第一点数

  • C语言超详细讲解指针的使用

    目录 指针概述 自身类型 指向类型 代码例子 数值型指针 字符型指针 单字符 字符数组 字符串型指针 字符数组总结 指针概述 C语言中指针也可以认为是一种类型,不同于数值型和字符型的类型.推演过去指针变量也就是相当于不同的变量类型,不同于数值变量.字符型变量.字符串变量. 指针变量两种类型:自身类型和指向的类型 自身类型:将变量名去掉,剩下的就是指针变量类型. 指向类型:将变量名和离它最近的一个*去掉,剩下的类型就是指针指向的类型 int num = 10; int* p = NULL; p =

  • C语言详细讲解if语句与switch语句的用法

    目录 一.if 语句 二.switch 语句 三.错误提示 一.if 语句 格式: if(写条件){输出内容}条件为真运行这个. else {输出内容}否则输出这个. 代码: #include <stdio.h> int main(void) { int score; //定义一个变量 score printf("请输入你的分数:"); scanf("%d",&score); //键盘输入你想要的分数 if (score>700) //给出

随机推荐