C中 数组和指针的异同】的更多相关文章

数组在很多情况下是和指针等价的,数组的下标运算和指针的解引用也有等价形式:arr[i] == *(arr + 1):但是也有一些情况下数组和指针是不一样的:extern int arr[]; extern int *arr; 这里持续记录一下指针和数组的异同(以下来自于C专家编程) 首先明确一下几个定义: 声明和定义:C语言中的对象必须有且只有一个定义,但是可以有多个extern声明. 定义 只能出现在一个地方 确定对象的类型并分配内存,用于创建新的对象.例如:int my_array[100]…
C语言的数组和指针一直是两个容易混淆的东西,当初在学习的时候,也许为了通过考试会对指针和数组的一些考点进行突击,但是很多极其细节的东西也许并不是那么清楚.本篇侧重点在于分析数组与指针的关系,什么时候数组可以等同于指针,什么时候二者不同. 数组的访问 首先通过一张图来描述一下数组的访问过程,下图的字符数组,访问下标为9的的元素           需要注意的是如果其他类型的变量,那么偏移量的计算应该是 i*单变量字节数,比如char是一个字节,int是4字节,那么int类型数组计算地址是,应该是加…
数组与指针 长期以来,在C/C++中,数组名和指向数组首元素的指针常量到底是以一种什么关系,一直困扰着很多人.很多地方,甚至是一些教科书中都在说,"数组名就是一个指向数组首元素的指针常量".但事实是,这是一种错误的说法!我们可以在很多场合中把数组名看作一个指向数组首元素的指针常量,但绝不能将这两者当成同一个东西. 真实的关系 数组是数组,指针是指针,这是两种不同的类型. 数组既可以表示一种数据类型,也可以表示这种类型的一个对象(非面向对象之对象,下同),表示对象时也可以称之为数组变量,…
    新手入门:C/C++中数组和指针类型的关系 对于数组和多维数组的内容这里就不再讨论了,前面的教程有过说明,这里主要讲述的数组和指针类型的关系,通过对他们之间关系的了解可以更加深入的掌握数组和指针特性的知识! 一个整数类型数组如下进行定义: int a[]={1,2,3,4}; 如果简单写成: a;//数组的标识符名称 这将代表的是数组第一个元素的内存地址,a;就相当于&a[0],它的类型是//注意这里的表示就是将a数组的起始地址向后进一位,移动到第二个元素的地址上也就是a[0]到a[1]…
问题一 首先,来看一下下面这段代码: #include <stdio.h> #include <string.h> int main() { char *str = "media"; char *tmp = "aaa"; printf("str: %s\n",str); strcat(str,tmp); printf("str: %s\n",str); return 0; } 代码打眼儿一看,功能很明显…
1.数组和指针 ] = {,,,,};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0] == *(array+0) printf("%p\n", pa); printf("%p\n", array); /* 访问数组两种方式 1. 下标法访问 数组名[下标] 指针[下标] 下标:偏移量 2. 指针法访问 *(p+1) */ 2.指针数组 ] = {,,…
在这里随便定义一个数组 int arr[5]; arr现在就是数组名, arr 代表的是该数组整块内存,即sizeof(arr) == 20 (假设sizeof(int) == 4), arr 里的内容是该块内存的首地址,即 arr == &arr[0]  . arr可以看做是一个常量,也就不可以使用 arr++ 之类的运算. int *p; p = arr; p是一个指向int类型的指针,p  = arr,就是把数组的首地址(arr的内容就是数组的首地址,这个前面有分析)赋给p,即 p 现在就…
联系: 1,一个通过数组和下标实现的表达式可等价地通过指针和偏移量实现. 2,当数组名传递给一个函数时,实际上传递的是该数组第一个元素的地址. 区别: 1,指针是一个变量,因此,在C语言中,语句pa=a和pa++都是合法的.但数组名不是变量,因此,类似于a=pa和a++形式的语句是非法的. 2,数组名代表定义的一整块内存,sizeof 得到的是整个数组的字节大小,而指针终究是一个变量,sizeof 得到的是该指针占用的字节数.…
利用PHP内置的函数 key() 获得键. current()获得值, next(); prev();移动到上一个 reset();//重置,移动到第一个元素 end();//移动到最后一个元素上 注意一旦指针位置非法,则不能做相对移动(next,prev),可以绝对移动(reset,end) reset,使用频率较高! each(),集合了 key,current,和next三者的功能!将当前元素信息获得后,移动指针到下一个元素上! 元素信息数组 = each($arr).移动指针 注意,元素…
C语言中数组和指针是一种很特别的关系,首先本质上肯定是不同的,本文从各个角度论述数组和指针. 一.数组与指针的关系数组和指针是两种不同的类型,数组具有确定数量的元素,而指针只是一个标量值.数组可以在某些情况下转换为指针,当数组名在表达式中使用时,编译器会把数组名转换为一个指针常量,是数组中的第一个元素的地址,类型就是数组元素的地址类型,如:int a[5]={0,1,2,3,4}; 数组名a若出现在表达式中,如int *p=a;那么它就转换为第一个元素的地址,等价于int *p=&a[0]:再来…
本文转载自CSDN@WalkingInTheWind,原文链接:https://blog.csdn.net/luckyxiaoqiang/article/details/7044380 C语言中数组和指针是一种很特别的关系,首先本质上肯定是不同的,本文从各个角度论述数组和指针. 1. 数组与指针的关系 数组和指针是两种不同的类型,数组具有确定数量的元素,而指针只是一个标量值.数组可以在某些情况下转换为指针,当数组名在表达式中使用时,编译器会把数组名转换为一个指针常量,是数组中的第一个元素的地址,…
/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:wdzxl198@163.com /*  转载请注明本文出处: *  http://blog.csdn.net/wdzxl198/article/details/9087497 /**************************…
GO语言中数组和指针 数组 Go语言提供了数组类型的数据结构. 数组是同一数据类型元素的集合.这里的数据类型可以是整型.字符串等任意原始的数据类型.数组中不允许混合不同类型的元素.(当然,如果是interface{}类型数组,那么一个数组元素可以包含任意数据类型.) 数组的每一个元素都是类型相同.长度固定且已经编号的,所以数组元素可以通过索引来读取(或者修改).索引从0开始,第一个元素的索引为0,第二个元素的索引为1,以此类推. 数组的声明 Go语言数组的声明需要指定元素类型以及元素的个数.数组…
数组与指针看起来很像 int a[] = {1, 2 ,3}; int *p = a; 如此,我们可以p[0], p[1], p[2] 看起来,与直接使用数组名没什么两样,但是看这段代码 sizeof(a) sizeof(p) 你就会知道,原来数组里还隐含了大小信息,这是指针所不能做到的 严格的说,数组是一种内置的数据类型,C++标准对这种数据类型限定的某些行为使他看起来像 指针 1array are passed by reference by default 这句话是说,我们可以将数组名赋给…
我们都知道,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语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式和使用形式完全对上号的例子越来越少了.而C语言中比较绕人的指针数组和数组指针的问题,int *ap[]和int (*ap)[]谁是指针数组,谁又是数组指针?这里面声明的解析规则是什么样的?本文主要为你解答这些疑惑.       我们来看看下面的语句,和它们对应的编译结果: int (*ap)[2]=…
说起c语言的指针,估计对c语言只是一知半解的同志们可能都会很头疼,尤其它跟数组又无耻的联系到一起的时候,就更加淫荡了!!! 怎么说呢,就是有一点规定:(或准则) 数组名可以看成是指向数组头元素的指针,对,只是能看成.但,数组名,不是指针(不能相互赋值).不过,可以当指针用.但是,指针不可以当数组名用. 在c语言的始祖书籍<K&R>中,有这么一段声明:只有在作为函数形参的时候 int a[]; int *a;   具有相同的意义. 这个必须要理解. 例如: char str[]=&quo…
指针变量为什么需要类型? 数组变量和指针变量在使用sizeof时不同,sizeof(数组变量)是数组长度,sizeof(指针变量)是存储int的字节长度4或者8(64bit). 数组变量在参数传递中,变成指针变量,这样就不能获取数组长度了,导致发生退化. 数组变量并没有被分配空间,只是在使用时,会被替换成数组第一个元素的地址.而指针变量会被分配空间. 代码示例: char a[] = "xy"; char *b = a; ,,,}; int *d = c; printf("a…
引自: http://blog.csdn.net/tianyue168/article/details/5781924 #i nclude <iostream.h> int  main( int  argc,  char * argv[]) { char  str[10]; char  *pStr = str; cout <<  sizeof (str) << endl; cout <<  sizeof (pStr) << endl; retur…
原文:http://www.cnblogs.com/ddx-deng/archive/2012/12/16/3755862.html 第一个结论: #include "iostream.h"void main(){1. char str[]="abcdef";2.int n[]={1,2,3,4,5};3.char *p=str;//4. cout<<sizeof(str)<<endl;一个字母在内存中占一个字节,这里输出7,7个字节但是6个…
参考于https://blog.csdn.net/wtzdedaima/article/details/78377201 C语言也学了蛮久的,其实一直都没有用到过或者碰到过引用的例子.前端时间再全面复习C的基础知识,看到引用这一块,发现两者的还是有一些差别的,抱着我不用,万一别人用我也需要看懂的原则,仔细观察研究了两者的区别. 一下内容为转载: 引用:引用是一个变量的另一个名字,又称别名.定义方式: int a=10: int &b=a:在这里,意思就是给a变量起了一个新名字b,因此b不可再次被…
数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = { 1,2,3,4,5 }; f(a); 上述代码输出的是4(32位系统)或8(64位系统),总之不是sizeof(int) * 5(数组大小). 为什么明明形参是数组形式的int [],实际上和指针形式的int *无异呢?关键原因就在于,数组是不能作为左值的. 函数传参并不是相当于赋值而是相当于初始化.于是…
#################################                              ##       基本知识               ##                              ################################# 当然我们一切都是从最简单的内建类型开始,最后我会做一些推广.先看一下基本的形式,我们从这里起步! --------------指针---------------- int a=10; i…
[VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及如何访问和利用memset赋值等操作. 直接给出代码说明: #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> struct TEST { int…
注:本文转自http://www.cnblogs.com/furaibo/archive/2010/03/19/1689710.html 魔幻数组名 请看程序(本文程序在WIN32平台下编译): #include <iostream> int main() { ]; char *pStr = str; cout << sizeof(str) << endl; cout << sizeof(pStr) << endl; ; } 1.数组名不是指针…
二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 nums 为例: 从概念上理解,nums 的分布像一个矩阵,但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: 1 int nums[2][3] = { 10,20,30,40,50,60 }; 2 //以上定义与下边相同 3 int nums[2][3] = { {10,20,30}, {40,50,60} }; 在几乎所有的程序语言中,二维数组都是按行排…
  指针数组和数组的指针,指的是两个不同的东西. 指针数组是有指针组成的数组,数组的指针是一个数组的指针. package main import "fmt" const MAX = 3 func main() { a, b, c := 100, 2, 3 arr := [3]int{a, b, c} // 定义数组,golang中默认是值拷贝 // 定义数组指针 var ptrArr *[3]int ptrArr = &arr arr[1] = 200 fmt.Println…
数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明显的,第一个是数组a,第二个是指针p.下一个问题是a的类型是什么?p的类型是什么?a[0]的类型是int,而a是个数组名,它是否表示整个数组呢?事实并非如此,a是一个指针常量,是一个指向int的指针常量,而p是一个指向int的指针,是一个变量.这是它们的第一个区别:一个是常量,一个是变量.那么常量和…
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另一个vector,也是将一个vector 的元素逐个赋值给另一vector 的对应元素: //将一个vector 赋值给另一vector,使用迭代器访问vector 中的元素 vector<, ); vector<int> ivec1; for (vector<int>::ite…
指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而是变量的地址.如上代码,指针p中保存的是整型变量i的地址信息. 接下来看如何定义一个指针,既然指针也是一个变量,那么它的定义也和其它变量一样定义:如:int p:是间接寻址或间接引用运算符.上例中我们还看到了一个特别的运算符&,它是一个取地址运算符(在其他合适场合&也是按位运算运算符,&…