对二维数组使用指针进行操作的探索(C语言)

 1 /*
 2     Name: 对二维数组使用指针进行操作的探索
 3     Copyright:
 4     Author: lingr7
 5     Date: 01/12/18 11:55
 6     Description:
 7 */
 8 #include<stdio.h>
 9 int main() {
10
11     int a[2][3] = {{1,2,3},{4,5,6}};
12     int **p = a;/*这一步,将a存放的地址赋值给了p,这一步是的p与a完全等价*/
13     int *p2 = p;/*这一步就将a[0][0]的地址确实地存入了p2,
14     与int *p2 = a;语句完全等价,同时进行了强制转换*/
15
16     printf("a[1][2]的值:%d\n", *(p2 + 1*3 + 2));/*对二维数组访问成功*/
17     printf("a[1][2]的值:%d\n", *((int*)p + 1*3 + 2));/*访问成功*/
18     printf("a[1][2]的值:%d\n", *((int*)a + 1*3 + 2));/*对二维数组访问成功*/
19    /* 既然(int*)a与 *(int(*)[3])a在这里是等价的,那么还是(int*)a更方便一点*/
20     printf("a[1][0]的值:%d\n", *(*(int(*)[3])a+1*3+0));/*访问成功*/
21     printf("a[1][0]的值:%d\n", *(*(int(*)[3])p+1*3+0));/*访问成功*/
22     /*以上能够正确的访问二维数组*/
23
24     printf("a[1][0]的值:%d\n", *(a+1*3+0));/*这里因为a的地址的多重性而混乱,必须强制转换确认
25     a是一个指向整型元素的指针,才能正确使用a里存放的地址*/
26     printf("a[1][0]的值:%d\n", *(*(int(*)[3])p+1*3+0));/*p与a的效果完全一样*/
27     /*printf("a[1][0]的值:%d\n", *(*(int*)p+1*3+0));/*编译不通过*/
28     printf("a[1][0]的值:%d\n", *((int*)*p+1*3+0));/*操作失败*/
29     printf("a[1][0]的值:%d\n", *((int*)(*p)+1*3+0));/*操作失败*/
30     printf("a[1][0]的值:%d\n", *(p+1));
31     printf("*p应该是一个指向指针的指针:%d", *p);
32     printf("\n");
33     printf("a的地址:%d\n", a);
34     printf("a[0][0]的地址:%d\n",&a[0][0]);
35     printf("a[0][0]的值:%d\n", *p);
36     printf("a[1][2]的值:%d\n", *(p + 1*3 + 2));/*这里和int *p = a的结果不同*/
37     printf("a[1][2]的值:%d\n", *p + 1*3 + 2);/*21,这里应该是5才对啊
38     这里跟对二维数组的操作无关,因为*p指向一个指向整型的指针,可是*P移位根本不确定,*P移位后指向什么东西*/
39     /*printf("a[1][2]的值:%d\n", *(*p + 1*3 + 2));/*存储地址为21的东西没办法输出*/
40     printf("a[0][0]的值:%d\n", *(p+1));
41     printf("p+1之前:%d\n",p);
42     p++;
43     printf("p+1之后:%d\n",p);/*地址+1,实际上是10进制加8了,这是因为p是一个指针,+1之后是下一个
44     而p指向一个指针,对p移位所以是下一个存储地址长度,与p指向的那个指针指向的类型无关*/
45
46 }

原文地址:https://www.cnblogs.com/lingr7/p/10048917.html

时间: 2024-11-10 11:37:30

对二维数组使用指针进行操作的探索(C语言)的相关文章

程序猿之--C语言细节13(二维数组和指针,&amp;*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)

主要内容:二维数组和指针,&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

直观理解C语言中指向一位数组与二维数组的指针

一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

程序员之--C语言细节13(二维数组和指针,&amp;amp;*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)

主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

C语言 二维数组与指针笔记

今天分析了C语言二维数组和指针的基本理解,感觉有点懵...代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> //void func(int p[][]) //这样写等同于void func(int **p) p++移动了四个字节,(*p)++移动了四个字节,不符合二维数组规律 //{ //} //列优先输出的函数(即竖着输出) void func

例看二维数组,指针,二维数组指针

例程: /****************************************************** * * 文件名:例程 * * 文件描述:例看二维数组,指针,二维数组指针 * * 创建人:Jesse * * 版本号: * * 修改记录: * ******************************************************/ #include <stdio.h> #define ROW 3 #define LINE 3 void main(voi

二维数组及指针

首先,看一维数组. []符号是下标运算符,a[i]就是*(a+i) 那么a[i][j] 就是*(a[i]+j)=*(*(a+i)+j) 本人对二级和多级指针的理解:1.抽象上说二级指针的内容是地址的地址.变量A好像跟你捉迷藏似的,你要想找到A,你先得去一个地方把A的地址给找出来,然后再根据这个地址找到A.就类似武侠电影里的宝藏,你要先去一个人的背上发现藏宝图,然后再根据藏宝图里画的地址找到宝藏,在这里,这个人的背就是一个最外层的地址,藏宝图就是内层的地址.2.对于二级指针和多级指针,定义时,我们

二维数组和指针

二维数组和指针⑴ 用指针表示二维数组元素.要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题.我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了.而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组 下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了.设p是指向数组a的指针变量,若有:p=a

C二维数组用指针地址遍历

#include <stdio.h> #include <stdlib.h> int main(){ int a = 100; void *p = &a; printf("a:%d address:%p\n",*(int*)p, &a); //unsigned int *pt = (unsigned int*)0xbfa70ee8; int *pt = (int*)malloc(sizeof(int)); *pt = 200; printf(&q

C语言 二维数组(指针)动态分配和释放(转)

C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按照16位.32位.64位为单位进行编辑的话:旧的16位处理器,比如Intel 80286 CPU需要8个指令,32位的处理器需要4个指令,而64位处理器则只要两个指令,显然,在工作频率相同的情况下,64位处理器的处理速度会比16位.32位的更快.而且除了运算能力之外,与32位处理器相比,64位处理器