数组指针,指针数组例子解析

//数组与指针
/*
#include<stdio.h>
void main ()  
{    
    int arr[10]={1,2,3,4,5,6,7,8,9,10};  
    int *p;  
    int (*q)[10];  
    p = arr;  //数组首元素地址
    q = &arr;  //数组首地址

//(数组首元素地址的操作)数组元素的引用与表示, 以第0个元素为例
    printf("************数组元素的7种基本表示方法*****\n");
    printf("----- arr[0] = %d, 0[arr] = %d, *(arr+0) = %d-----\n", arr[0], 0[arr], *(arr+0));
    printf("-----  p [0] = %d,  0[p]  = %d,  *(p+0)  = %d-----\n", p[0], 0[p], *(p+0));
    printf("--- *(int*)q = %d---------------------------------\n", *((int*)q+0));
    printf("数组首元素的地址 = %p\n", p);
    printf("数组首元素的地址加一后的地址及其值: %p, %d\n", p+1, *(p+1));
    //(数组首地址的操作)指针指向的特殊改变
    printf("数组首地址 = %p\n", q);
    printf("数组首地址加一后的地址及其值:%p, %d\n", q+1, *(int*)(q+1));
}
*/
//指针数组---指针数组的定义初始化和使用
/*
#include<stdio.h>
int main()
{
    int a = 1, b = 2, c = 3;
    char* arrc[3] = {"aaa", "bbb", "ccc"};
    char** parrc = arrc;
    
    int* arri[3] = {&a, &b, &c};    
    int** parri = arri;

//int* arri[] 地址操作&元素操作
    //int* arri[] 地址操作
    printf("arri[0] = %p, arri[1] = %p, arri[2] = %p\n", arri[0], arri[1], arri[2]);
    printf("arri[0]+1 = %p, arri[1]+1 = %p, arri[2]-2 = %p\n", arri[0]+1, arri[1]+1, arri[2]-2);
    printf("*(parri+0) = %p, *(parri+1) = %p, *(parri+2) = %p\n", *(parri+0), *(parri+1), *(parri+2));
    //int* arri[] 元素操作
    printf("*arri[0] = %d, *arri[1] = %d, *arri[2] = %d\n", *arri[0], *arri[1], *arri[2]);
    printf("*(arri[0]+1) = %d, *(arri[1]+1) = %d, *(arri[2]-2) = %d\n", *(arri[0]+1), *(arri[1]+1), *(arri[2]-2));
    printf("**(parri+0) = %d, **(parri+1) = %d, **(parri+2) = %d\n", **(parri+0), **(parri+1), **(parri+2));

//char* arrc[] 地址操作&元素操作
    //char* arrc[] 地址操作
    printf("arrc[0] = %p, arrc[1] = %p, arrc[2] = %p\n", arrc[0], arrc[1], arrc[2]);
    printf("parri+0 = %p, parri+1 = %p, parri+2 = %p\n", parri+0, parri+1, parri+2);

//char* arrc[] 元素操作
    printf("arrc[0] = %s, arrc[1] = %s, arrc[2] = %s\n", arrc[0], arrc[1], arrc[2]);
    printf("*(parrc+0) = %s, *(parrc+1) = %s, *(parrc+2) = %s\n", *(parrc+0), *(parrc+1), *(parrc+2));
    return 0;
}
*/

//指针必须初始化才可使用,及指针层面的交换问题

1:int main ( )

2:{

3: char *str[5]={"welcome","to","fortemedia","Nanjing"};

4: char * * p=str+1;     //p存储 "to"字符串地址的地址,即&str[1]

5:

6:     str[0]=(*p++)+2;//str[0]指向&‘\0‘,然后p后移一位,

//存储"fortemedia"字符串地址的地址,即p = &str[2]

7:     str[1]=*(p+1); //p+1 = &str[3];则 str[1] = str[3],

//即str[1]和str[3]都指向同一地址&”Nanjing”

8:     str[2]=p[1]+3;//p[1]存储"Nanjing"字符串的地址,为(char *)型,

//p[1]+3相当于p[1]+sizeof(char)*3,

9:                  //即str[2]指向"Nanjing"字符串中的"jing"地址

10:     str[3]=p[0]+(str[2]-str[1]);

//str[3]指向从p[0](也就是*p(str[2]))开始的

//偏移量为3, str[2]指向"jing",即p[0]指向"jing"

11:                 //所以str[3]指向"jing"的"g"地址

12:     printf("%s\n",str[0]); //输出‘\0‘,也即换行

13:     printf("%s\n",str[1]); //输出"Nanjing"

14:     printf("%s\n",str[2]); //输出"jing"

15:     printf("%s\n",str[3]); //输出"g"

16:

17:     return 0;

18:}

图解注释:

代码行4:

代码行6:

代码行7:

代码行8:

代码行10:

Other one

1:int main()

2:{

3: char *str[5] = {"welcome","to","fortemedia","Nanjing"};

4: char **p = str + 1; //p存储 "to"字符串地址的地址,即&str[1]是”to”

5: str[0] = *p++;         //首先p++,则此时p此时存储了&str[2]时”fortemedir”

//p++仍是p加一之前的值

6:                          //str[0]相当于str[1]相当于”to”

7:     str[1] = *(p+1);  //*(p+1)的结果相当于&"Nanjing"

//故str[1]相当于&"Nanjing",相当于str[3]

8:     str[2] = p[1] + 3; //p[1]相当于*(p+1),相当于&"Nanjing"

//然后*(p+1)+sizeof(char)*3,则此时str[2]存储

9:                         //str[2]相当于"Nanjing"字符串中的子字符串&"jing"

10:     str[3] = p[0] + (str[2] - str[1]); //str[2] - str[1]的结果为3,

//第五行p[0]相当于str[2],目前存储了(第九行)&"jing"

11:                                 //故str[3]相当于&"g"

14:     printf("%s\n",str[0]);  //输出"to"

15:     printf("%s\n",str[1]); //输出"Nanjing"

16:     printf("%s\n",str[2]); //输出"jing"

17:     printf("%s\n",str[3]); //输出"g"

18:     return 0;

19:}

以下是对上述代码关键行的图解注释:

代码行4:

代码行5:

代码行7:

代码行8:

代码行10:

---------------------

原文地址:https://www.cnblogs.com/-lhy-to-s/p/10664907.html

时间: 2024-10-06 23:21:08

数组指针,指针数组例子解析的相关文章

关于DELPHI数组,指针,字符串转换的例子!(转)

var   aa:   array [0..5] of Char;   bb:Pointer;   cc:string;   dd:PChar; procedure TForm1.Button1Click(Sender: TObject);begin dd:='abcdef'; //以下是pchar内容转数组FillChar(aa,length(dd),#0);Move(dd^,aa,SizeOf(aa)); //以下是数组传递到指针bb:=GetMemory(SizeOf(aa));Move(

指针和数组解析

指针和数组 指针和数组是一样的吗? 经常可以看到“数组就是指针”.“数组名就是常量指针”这些说法,但真的是这样吗?让我们先看一下指针和数组的定义. 1. 指针 根据C99标准,指针的定义如下: A pointer type may be derived from a function type or an object type, called the referenced type. A pointer type describes an object whose value provides

DELPHI数组,指针,字符串转换的例子

关于数组,指针,字符串转换的例子 var   aa:   array [0..5] of Char;   bb:Pointer;   cc:string;   dd:PChar; procedure TForm1.Button1Click(Sender: TObject);begindd:='abcdef'; //以下是pchar内容转数组FillChar(aa,length(dd),#0);Move(dd^,aa,SizeOf(aa)); //以下是数组传递到指针bb:=GetMemory(S

指针、数组的理解与关系

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

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针

附录一 再论指针和数组

附录一 附录一 再论指针和数组 再论指针和数组 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 预习检查 链表单元有哪几个部分组成 如何申请链表单元,及释放链表单元 实现单链表插入的基本语法 简述一下快速排序基本理论要点 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Dat

c/c++ 函数、常量、指针和数组的关系梳理

压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和类型,c 中的数组参数是引用形式传参(传址调用),而常量标量是按值传递. //[]方括号表示声明的是数组,里面的数字表明了数组包含的元素数目 int states[50];//声明50个整数的数组 double code[365];//声明365个浮点数的数组 char chr[20];//声明20

程序设计基石与实践系列之类型提升、内存分配,数组转指针、打桩和矢量变换

英文出处:Peter Fa?ka: Guide to Advanced Programming in C C语言可用于系统编程.嵌入式系统中,同时也是其他应用程序可能的实现工具之一. 当你对计算机编程怀有强烈兴趣的时候,却对C语言不感冒,这种可能性不大.想全方位地理解C语言是一件极具挑战性的事. Peter Fa?ka 在2014年1月份写下了这篇长文,内容包括:类型提升.内存分配,数组转指针.显式内联.打桩(interpositioning)和矢量变换. 整型溢出和类型提升 多数C程序员以为,

Android For JNI(四)——C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统

Android For JNI(四)--C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统 好几天每写JNI了,现在任务也越来越重了,工作的强度有点高,还有好几个系列的博客要等着更新,几本书还嗷嗷待哺的等着我去看,github上的两个散漫的开源,基础入门的视频也在录制,还要学习新的知识, 都是一种挑战,不知道为何,最近懒散了,看来还得再加把劲,今天我们继续延伸一下C的一些小知识 一.数组 C的数组和JAVA也是类似的,我们写一段小程序 #include <stdio.h> #inc