C语言-再论指针与数组

指针与数组的天生姻缘
1、以指针方式来访问数组元素
(1)、数组元素使用时不能整体访问,只能是单个访问。访问形式有两种:数组形式和指针形式。
(2)、数组形式访问数组元素:数组名[下标];(下标从0开始
(3)、指针格式访问数组元素:*(指针+偏移量);
(4)、数组下标方式和指针方式均可以访问数组元素,两者的实质是一样的。在编译器内部都是用指针方式来访问数组的,
数组下标方式只是编译器给编程者提供了一种壳而已。所以用指针方式来访问数组才是本质的做法。
2、从内存角度理解指针访问数组的实质
(1)、数组的特点就是:数组中各个元素的地址是依次相连的,而且数组还有一个很大的特点就是数组中各个元素的类型
比较相同。类型相同就决定了每个数组元素占几个字节是相同的。
(2)、数组中的元素其实就是地址相连接、占地大小相同的一串内存空间。
这两个特点就决定了只要知道数组中一个元素的地址,就可以很容易推算出其他元素的地址。
3、指针与数组类型的匹配问题
(1)、int *p; int a[5];  p = a;    //类型匹配,a做右值等同于&a[0];
(2)、int *p; int a[5];  p = &a;   //类型不匹配,p是int *,&a是整个数组的指针,也就是一个数组指针类型,不是
                                      int指针类型,所以不匹配。
(3)、&a、a、&a[0]从数值上看是完全相等的,但是从意义上看就不同了。从意义上看,a和&a[0]是数组首元素首地址,
而&a是整个数组的首地址;从类型上看,a和&a[0]是元素的指针,也就是int * 类型的;而&a是数组指针,是int (*)[5];类型。
4、总结:指针类型决定了指针如何参与运算
(1)、指针参与运算时,因为指针变量本身存储的数值是表示地址的,所以运算也是地址的运算。
(2)、指针参与运算的特点就是:指针变量+1,并不是真的加1,而是加1*sizeof(指针类型);如果是int *类型,则+1就
实际表示地址+4,如果是char *指针,则+1就表示地址+1;如果是double *指针,则+1就表示地址+8.

 1 #include <stdio.h>
 2
 3 int main(void)
 4 {
 5
 6     int a[5] = {1,2,3,4,5};
 7     printf("a[3] = %d.\n",a[3]);        //打印出结果是4
 8     printf("*(a+3) = %d.\n",*(a+3));    //打印出结果是4;a在这里做右值,相当于
 9                                         //一个地址,a+3相当于地址加3
10                                         //所以就相当于 int *p; p = a + 3; printf出*p;
11     return 0;
12 }

原文地址:https://www.cnblogs.com/jiangtongxue/p/11369308.html

时间: 2024-08-18 17:35:59

C语言-再论指针与数组的相关文章

附录一 再论指针和数组

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

程序猿之---C语言细节(指针和数组细节,&quot;//&quot;的可移植性说明)

主要内容:指针和数组细节,"//"的可移植性说明 #include <stdio.h> int main(int argc, char **argv) { int a[10]={1,2,3,4,5,6,7,8,9,0},*p; #if 0 /* 按移植性来说,在<c语言程序设计--现代方法>指出要用当前注释方法,而不是// 因为一些编译可能不支持 */ // 错误举例 while(*a != 0) { a++; // a++ 相当于a = a+1,不能改变a的值

C语言中的指针与数组

1.指针与数组 1)指针与一维数组 i.数组指针(指向数组元素的指针) 类型  *指针变量名: 指针定义完成后要初始化(不想让指向任何内容,=0,=NULL) int a[10]; int *p = &a[0];   // &a[0] == a int *p1 = a; ii.用数组的指针访问数组元素 偏移:指针变量的偏移 p1 = p1+1;    //向下偏移1个一个数组元素 p1++;   //p1中存放的还是地址 .... 如果用指针访问第i个元素 p1+i 取出pi指向的元素的值

C语言中的指针和数组

下面的内容节选自由我所执笔的会议记录.对于本文的不足之处,各位可以提出自己的看法. Q1:指针和数组到底是怎么一回事? A:指针和数组有本质的不同.指针就是一个内存地址,在32位系统下,一个指针永远占4个字节:数组是一块连续的内存空间,我们从一个已定义的数组中可以获得数组大小以及这块连续内存空间的起始地址.这个起始地址即数组首元素的地址,更具体的说是数组中首个元素的首地址. 在C语言中,只有一维数组.但是,当一个一维数组的元素是仍然是一维数组时,就形成了所谓的一维数组.如何印证这一点?二维数组在

C语言学习笔记--指针和数组的关系

1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译器自动分配一片连续的内存空间 ,而指针声明时只分配了用于容纳地址值的 4 字节空间 2.指针的运算 (1)指针是一种特殊的变量,与整数的运算规则为: p + n == (unsigned int)p + n * sizeof(*p); 当指针 p 指向一个同类型的数组的元素时,p+1 指向当前元素的

C语言中使用指针与数组的区别

在c语言中,指针和数组名都表示地址,但两者却有很大的不同之处,对于初学者来说一定要弄清楚两者的区别. 首先,我举个简单的例子: char *p1="hello!";  //定义字符型指针p1,并将指针p1指向字符串"hello!"的首地址. char s[10]="hello!";  //定义数组s,并将其初始化赋值. 然而,如果char s[10]; s="hello!";这样就会报错,为什么呢?原因很简单,因为数组名是常量

C语言中的指针与数组的关联1

在C语言中,指针是一种类型,存放的是地址,例如char*p,这里p存放的是字符型数据的地址,int*p,p存放的是整形数据的地址,我们可以通过解运用*来获取该地址所指向的内容.而数组则是一种数据类型的集合,如int arr[]={1,2,3,4,5,6,7,8,9,10};这里声明与定义了一个整形数组,而char arr[]="hello world";则是声明与定义了一个字符类型的数组,这个数组内存放的是一个字符串. C语言规定,在大多数情况下数组名其实质就是数组元素的首地址,所以我

C语言中的指针与数组的定义与使用

指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 全局变量 内存映射 可以对内存的内容修改修改硬盘的内容 一般在数据库中经常使用 内存的分配与释放 c语言分配内存的方法 // malloc(需要分配的大小): 这里的分配的大小需要对齐的2的指数 void *mem = malloc(size); 释放内存 // 一般分配的内容都是在堆空间中的 //