c数组和指针的理解

 1 #include<stdio.h>
 2
 3 int main(void)
 4 {
 5     int a[]={1,2,3,4,5};
 6     int *p = (int*)(&a + 1);
 7     printf("%d,%d\n",*a+1,*(p-1));
 8
 9     // int (*ptr1)[5] = &a;    √
10     // int (*ptr2)[5] = a;     ×
11     // int (*ptr1)[3] = &a;    ×
12     // int (*ptr2)[3] = a;     ×
13 }
14
15 //2,5

数组名只可以作为右值!

当我们定义一个数组时候,编译器根据指定的元素个数和类型确定分配内存大小。并把这一块地址的名称赋为数组名称。

a[0]、a[1]......为数组元素,但并非元素名称!

指针,32系统总是为4字节(0x11111111)只能存放一个地址单元的值,所以总是存放的首地址。

但是访问时候需要根据类型大小来移动指针。

数组名:值等同于数组“首元素”的“首地址”(数组首元素的指针)

P + 1

char*移动一个字节,int*移动4个字节!数组指针移动一个数组元素类型长度!二级指针移动一个指针长度(4)!

&a:表示数组指针(取数组变量a的指针)

对数组的访问,总是转换为对指针的访问!

二维数组

1 int b[2][2] = {{1,2},{3,4}};
2 // int *p2 = b;         ×
3 // int (*p5)[2] = b;    √
4 // int **p      = b;    ×

二维数组名称,指向首元素b[0]的指针,为数组指针【一级指针】!

1 // int *p3 = b[0];             √
2 // int (*p4)[2][2] = &b;    √

二维数组所有元素的访问(一级指针):

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int iArray[2][3] =        {{1,2,3},{4,5,6}};
 5     int *pArray = NULL;
 6
 7     pArray = (int*)iArray;
 8
 9
10     printf("array[0][0] = %d\n", *pArray);
11     printf("array[1][2] = %d\n", *(pArray + 5));
12     printf("array[1][2] = %d\n", *(pArray + 1 * 3 + 2));      /*数组本身在地址空间中就是连续排列的*/
13     printf("array[1][2] = %d\n", *((int *)(*((int (*)[3])pArray + 1)) + 2));
14     return 0;
15 }

二维数组所有元素的访问(数组指针):

1 #include<stdio.h>
2
3 int main()
4 {
5     int iArray[2][3] = {{1,2,3},{4,5,6}};
6     int (*pArray)[3] = NULL;
7
8     pArray = iArray;
9
10     printf("array[0][0] = %d\n", **pArray);
11     printf("array[1][2] = %d\n", *(*(pArray+1)+2));
12     return 0;
13 }
 1 int main()
 2 {
 3         int iArray[2][3] =        {{1,2,3},{4,5,6}};
 4
 5         int (*pArray)[3] = NULL;
 6
 7         pArray = iArray;
 8
 9         printf("array[0][0] = %d\n", pArray[0][0]);
10         printf("array[1][2] = %d\n", pArray[1][2]);
11         return 0;
12 }

二级指针

为指向指针的指针,指向的值必须是指针。

 1 int main()
 2 {
 3         int iArray[2][3] =        {{1,2,3},{4,5,6}};
 4         int *ipArray[2] = {iArray[0], iArray[1]};
 5         int **pArray = NULL;
 6
 7          pArray = ipArray;
 8
 9         printf("array[0][0] = %d\n", pArray[0][0]);
10         printf("array[1][2] = %d\n", pArray[1][2]);
11
12         return 0;
13 }
时间: 2024-08-16 03:27:11

c数组和指针的理解的相关文章

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

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

数组与指针(二)

对于数组,我们最为头痛的莫过于数组与指针的关系.在我看来,想要把数组和指针的关系理解通透,关键在于理解指针的关联类型(每个指针都有一个与之关联的数据类型).因为文章的篇幅比较长,所以分成了两篇,这是第二篇(没看第一篇的可以先看这里哦,磨刀不误砍柴工,大家要有点耐心 ^ ^ )http://www.cnblogs.com/CatDrinkMilk/p/4331355.html 二维数组与指针 在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语言:数组和指针

参考<C专家编程>的下列章节: 第4章 令人震惊的事实:数组和指针并不相同 第9章 再论数组 第10章 再论指针 数组名的理解: int a[10]; 1. a代表指向第一个数组元素的指针.做函数形参时,在表达式中时. 2. a看成一个整体.a的数据类型是int[10].因此a取地址后加一的步长为40 视频参考: 指针及指针操作 数组 高级指针.C.面向对象

程序员之--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<iostream>using namespace std;int main(){ int a[4]={1,2,3,4}; for(int i=0;i<4;i++) {  cout<<*(a+i);//*(a+i)和a[i]是等价的.  cout<<endl; } return 0;} 但是看下面这个代码 #include<iostream>using namespace std;

(C初学) 对数组与指针的一些浅显的理解

因为课堂上没听懂,又看不懂教科书(<C语言程序设计教程>第3版 谭浩强,张基温编著)上晦涩的表达方式,昨天晚上特意拿<C语言入门经典>这本书自己研究了一晚的数组与指针. 先来一个简单的程序: 1 #include<stdio.h> 2 3 int main() 4 { 5 char board[3][3]={ 6 {'1','2','3'}, 7 {'4','5','6'}, 8 {'7','8','9'} 9 }; 10 11 12 printf("valu

深入理解C语言中的指针与数组之指针篇(转载)

前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情,一直没有时间静下心来写这些东西,毕竟这确实是一件非常耗费时间和精力的事情:一方面,个人对C语言的掌握和理解也还有限,怕写出来的东西会对大家造成误导.当然,今天写的这些东西也肯定存在各种问题,不严谨甚至错误的地方肯定有,也希望大家来共同探讨,相互改进. 我会慢慢的写完这几章,有想法的童鞋可以和我探讨

深入理解数组与指针的区别

在大一刚开始学习C的我们也许并没有真正的理解数组与指针,其实C的精华部分便是指针与内存的分配这一块. 那是充其量我们能够知道数组与指针肯定不是完全等价的,相同点就是:对数组的引用总是转化为对指针的引用,而不同点呢就是数组名是常量而指针是变量仅此而已,随着我们资历不断的提升,我们么更加进一步的去理解它,从他的本质去即内存的分配与访问去理解它. 好了,首先呢我们必须明白一个概念在C语言中,一个变量的声明和定义有什么区别. 我们知道定义只是一个特殊的声明. 定义:只能出现在一个地方,创建新对象,同时确