数组指针/指针数组的使用

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

#define M 4
#define N 5

int main()
{
    int m = 4, n = 5;
    char arr[4][5] = {
        {‘A‘,‘B‘,‘C‘,‘D‘,‘E‘},
        {‘F‘,‘G‘,‘H‘,‘I‘,‘J‘},
        {‘K‘,‘L‘,‘M‘,‘N‘,‘O‘},
        {‘P‘,‘Q‘,‘R‘,‘S‘,‘\0‘}
    };

    char (*a)[N];                                 // a:指针
    a = arr;
    printf("%d\n", sizeof(a));                    // 4 ----> 计算指针空间
    printf("%d\n", sizeof(a[0]));                 // 5 ----> 计算数组空间
    printf("%s\n", a[1]);                         // FGHIJKLMNOPQRS
    printf("%s\n", a[1] + 3);                     // IJKLMNOPQRS
    printf("%c\n", *(a[1]) + 3);                  // I

    /*-------------------------------------------------------------------------
                         数 组 指 针 操 作 示 意 图

                             *(p[0])    *(p[0])+3
                                ||         ||
                                \/         \/
             p   或 p[0] -----> A   B   C   D  E

                             *(p[1])    *(p[1])+3
                                ||         ||
                                \/         \/
             p+1 或 p[1] -----> F   G   H   I   J

                                K   L   M   N   O

                                P   Q   R   S   T

    --------------------------------------------------------------------------------------------------------------*/

    char * b[N];                                  // b:数组
    for(int i = 0; i < m; i++)
        b[i] = arr[i];
    printf("%d\n", sizeof(b));                    // 20 ----> 计算数组空间
    printf("%d\n", sizeof(b[0]));                 // 4  ----> 计算指针空间
    printf("%s\n", b[1]);                         // FGHIJKLMNOPQRS
    printf("%s\n", b[1] + 3);                     // IJKLMNOPQRS
    printf("%c\n", *(b[1]) + 3);                  // I

    /*-------------------------------------------------------------------------
                         指 针 数 组 操 作 示 意 图

                             *(p[0])    *(p[0])+3
                                ||         ||
                                \/         \/
                    p[0] -----> A   B   C   D  E

                             *(p[1])    *(p[1])+3
                                ||         ||
                                \/         \/
                    p[1] -----> F   G   H   I   J

                                K   L   M   N   O

                                P   Q   R   S   T

    --------------------------------------------------------------------------------------------------------------*/

    char arr2[6] = {‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘\0‘};
    char *c = arr2;
    printf("%s\n", c);                            // ABCDE
    printf("%s\n", c + 3);                        // DE
    printf("%c\n", *c);                           // A
    printf("%c\n", c[3]);                         // D
    printf("%c\n", *(c+3));                       // D

    /*-------------------------------------------------------------------------
                         普 通 指 针 操 作 示 意 图

                            *c                   *(c+3)
                            ||                     ||
                            \/                     \/
                  (c)-----> A   B   C  (c+3)-----> D   E

    --------------------------------------------------------------------------------------------------------------*/
    return 0;
}
时间: 2024-10-18 21:18:26

数组指针/指针数组的使用的相关文章

C编译器剖析_1.5 结合C语言来学汇编_指针、数组和结构体

让我们再来看一份C代码,及其经UCC编译器编译后产生的主要汇编代码,如图1.33所示,其中包含了数组.指针和结构体. 图1.33 数组.指针和结构体 按照C的语义,图1.33第9行的C代码是对局部数组number的初始化,需要把number[0]初始化为2015,而数组中的其他元素皆被初始化为0.UCC编译器采取的翻译方法是:先调用memset函数来把数组number所占的内存空间清0,然后再把number[0]设为2015,如图1.33的第17至24行所示.C库函数memset的API如下所示

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

数组与指针的区别?

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.指针可以随时指向任意类型的内存块.    (1)修改内容上的差别 char a[] = "hello";  //它们有各自的内存空间:a[0] = 'X';char *p = "world"; // 注意p 指向常量字符串p[0] = 'X'; // 编译器不能发现该错误,运行时错误 (2) 用运算符sizeof 可以计算出数组的容量(字节数).sizeof(p),p 为指针得到的是一个 指针变量的字节数,

指针和数组

指针的几个要点: 一 指针的定义,赋值 要区分: int a; int *p = &a; 这是定义的时候初始化,即赋值 ======================= int a; int *p; p = &a; 定义,初始化分开,  就这里我迷惑了好久 ========================== 多个(修饰符)修饰变量,看变量名先和谁结合(先看后缀)(ps:符号和变量之间的空格不要计算,和距离无关 int*和int *....... int * p [5]    先和[ ]结合

C---通过指针访问数组

C语言规定:如果指针变量P已指向数组中的一个元素,则P+1指向同一数组中的下一个元素. 引入指针变量后,就可以用俩种方法来访问数组元素了. 如果p的初值为&a[0],则: P+i 和a+i 就是a[i]的地址,或者说它们指向a数组的第i个元素. *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i].例如,*(p+5)或*(a+5)就是a[5]. 指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价. 根据以上叙述,引用一个数组元素可以用: 1.下标法:即用a[i]形式

数组与指针

//使用递归来计算阶乘#include<stdio.h>long rfact(int n);int main(){ int num; printf("This program calculate factorials.\n"); printf("Enter a value in the range 0-12(q to quit): \n"); while(scanf("%d",&num)==1) { if(num <0

指针、数组的理解与关系

一.指针的本质:变量,指针变量就是指针变量int *p:两个变量,一个p(指针变量本身)是int *类型的 另一个是*p(指针指向的那个变量)是int类型的注:指针说白了就是指针类型,前面定义的int类型是为了说明指针指向的那个数的类型,所以指针的解析方式都是按地址来解析的(不管你是char *还是double *,解析方式都是地址)而指向的那个数的类型就要看你怎么定义的了例如:int *aa是按照地址来解析的:*a则是按照int类型来解析的. (1)所有的类型的数据存储在内存中,都是按照二进制

C语言中的函数、数组与指针

1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原型

数组与指针操作

一,数组 1,const int array[5] = {0, 1, 2, 3, 4}; 2,c99新特性,可以对指定的数组的某一个元素初始化.例如:int array[10] = {1, 3, [4] = 2, 6, 7, [1] = 32};如果多次对一个元素进行初始化,取最后一次的值. 3,c不支持把数组作为一个整体来赋值,也不支持用花括号括起来的列表形式进行赋值. 4,sizeof表达式被认为是一个整数常量. 5 * 5 - 1 就是整数常量表达式. 5,变长数组int array[n]

(C/C++)区别:数组与指针,指针与引用

1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存.指针远比数组灵活,但也更危险. 数组和指针特点的简单比较: 数组 指针 保存数据 保存地址 直接访问数据 间接访问数据,先取得指针的内容,然后以它为地址取得数据 用于存储数目固定且类型相同的数据 通常用于动态数据结构 编译器自动分配和删除