指针数组

C 杂谈之 指针与数组 (一)

久未见 提交于 2020-02-10 04:55:41
/*--> */ /*--> */ 思维导图 介绍 前接上文 C 杂谈之 指针与数组 (一) ,接续往下谈指针和数组。 指针与数组 ——承接上文进行扩展 你知道X = Y,在编译运行过程中,是什么样吗? 字符指针与函数 1> 字符串是一个以'\0'结尾的字符数组。 看一个例子:printf接受的是一个指向字符数组第一个字符的指针。 这个例子与下面两个代码是一个道理. 2> 几个常用字符函数的编写。 1>>> strcat(s,t)函数,把t指向的字符复制到s指向的字符后面?——注意'\0' #include <stdio.h>#include <assert.h>/* strcat(ps, t): Copy the charactor pointed * by t append to the character pointed by s */void *strcat(char *ps, char *t){ char *addr = ps; assert((ps != NULL) && (t != NULL)); while(*ps){ /* The s point to the last character */ ps++; } while(*ps++ = *t++){ /* Copy t append to the s*/ } return addr;}int main(){

为何不精通C? 04 辨析数组与指针

点点圈 提交于 2020-02-10 04:42:59
前言 学习C语言,指针绝对是一道大坎,很多人谈指针色变,使用起来小心翼翼的。“一切指针都是纸老虎” ,同时,对我们得“在战略上藐视指针,战术上重视指针”。 本文先 剖析 下 一维数组和指针 ,多维的情况后序博客继续更新。 文章流程: 1、辨析指针和数组的不同 2、辨析它们相同的时刻 3、总结 指针和数组为什么这么纠缠不清 首先说一点,指针的使用等同于数组的情况远远多于他们不同的情况,因此,在初学时,为了容易理解,很多人都 说 “指针=数组” 。 但是,这却 是错误 的! 来个例子吧: // file1.c 定义一个数组array int array[100];以上是在文件1中的定义 // file2.c 声明file1.c中的array extern int* array以上是在文件2中的声明 上面的例子对不对呢? 大家可以自己测试下,会很神奇的发现: 咔,怎么编译出 错 啦! 为什么 呢? 继续深入声明和定义 在辨析数组和指针前,首先要说下声明和定义的区别,之前博文“为何不精通C? 03 深入剖析声明” 中的末尾已经提过这一点了。这里重新说下: C语言中,对象 有且仅有一个定义 ,而声明却可以有 多个extern 声明 。 定义:只能出现在一个地方,确定同时分配内存,它是特殊的声明 声明:只是 描述 其他地方创建对象的 属性 。有extern前缀,作用于变量 对于 声明

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

懵懂的女人 提交于 2020-02-10 04:14:09
1. 数组的本质 ( 1 )数组是一段 连续的 内存空间 ( 2 )数组的空间大小: sizeof(array_type)*array_size; ( 3 )数组名可看做 指向数组第一个元素 的常量指针 (4 )数组声明时编译器自动分配 一片连续的内存空间 ,而 指针声明时只分配了用于容纳地址值的 4 字节 空间 2. 指针的运算 ( 1 )指针是一种特殊的变量,与整数的运算规则为: p + n == (unsigned int)p + n * sizeof(*p); 当指针 p 指向一个同类型的数组的元素时, p+1 指向当前元素的下一个元素, p-1 指向 上一个元素。 ( 2 )指针之间 只支持减法 运算且参与减法运算的指针 类型必须相同 。 p1 - p2 = ((unsigned int)p1 – (unsigned int)p2)/sizeof(type) ① 只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元 素的下标差。 ② 当两个指针指向的元素不在同一个数组中时,结果未定义。 指针运算的应用 #include <stdio.h> //统计元素的个数 #define DIM(a) (sizeof(a) / sizeof(*a)) int main() { char s[]={'H','e','l','l','o'};//栈 char*

C语言-再论指针与数组

末鹿安然 提交于 2020-02-10 04:10:34
指针与数组的天生姻缘 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]从数值上看是完全相等的,但是从意义上看就不同了

数组与指针的一些关系

早过忘川 提交于 2020-02-10 04:07:39
本文主要是理解这几个符号的意思a, a[0], &a, &a[0](前提是定义了数组int a[10]); 1、a代表的是数组名,a作左值的时候,表示的数组a[10]的整个内存空间的大小(也就是10*sizeof(int)这么多个字节)。a作右值的时候表示的是数组首元素的首地址,它的值和&a[0]的值是一样的,意义也完全一样,完全可以互相代替。同时因为在C语言中规定,数组是不能够整体访问的,所以a是不能够作左值的。 2、a[0]表示的数组的第0个元素。当a[0]作左值的时候,表示的是a[0]这个元素的内存空间,也就是sizeof(int)个字节的大小。当a[0]作右值的时候,表示的是a[0]这个地址空间所存放的数(房子里面住的人)。 3、&a表示的是数组的首地址,它的数值和数组首元素的首地址&a[0]、a完全一样,但是意义不一样。因为意义不一样,所以导致他们在参与运算的时候有不同的表示。&a是常量,不能做左值。 特别注意区分a和&a,虽然两个的数值的一样的,但是他们的意义不一样,a代表数组的首地址(意义是数组整个内存空间大小(10*sizeof(int))的首地址),&a代表的是数值首元素的首地址(意义是数组的首元素的内存空间大小(sizeof(int))的首地址) 来源: https://www.cnblogs.com/xing-ting/p/10212296.html

【知其所以然】语义\"陷阱\"---数组和指针

佐手、 提交于 2020-02-10 03:29:33
数组和指针经常出现于编程语言中、也许上课的时候老师也说过数组和指针有区别、参考书上也应该讲过,你是不是也不曾透彻的理清过? 这篇博文主要从内存和编译的角度指出了数组和指针在访问方式上的区别 、至于他们在函数调用的区别、以及它们的联系将在下一篇中详细讨论。 为了说的清楚些、会先说一些基础的部分、如果你已经掌握大可跳过 What's a Declaration? What's a Definition? 声明和定义 c语言的对象必须有且只有一个定义,但可以有多个声明(extern)这里说的对象和面向对象中的对象没有关系。 A definition is the special kind of declaration that creates an object; a declaration indicates a name that allows you to refer to an object created here or elsewhere。 定义是一种特殊的声明、它创建了一个对象;声明简单的说明了在其他地方创建的对象的名字,它允许你使用这个名字。 可以简单的这样理解: 声明 Declaration :描述在其他地方创建的对象,并不分配内存。(可以出现在多个地方) 定义 Definition :产生一个新的对象,并分配内存。(只能出现一次) How Arrays and

C++对象数组与对象指针

拈花ヽ惹草 提交于 2020-02-10 03:22:06
(一)对象数组   将具有相同类类型的对象有序地集合在一起便构成了对象数组,以一维对象数组为例,其定义形式为:   类名 对象数组名[];   Point points[100];   关于对象数组的几点说明:   (1)在建立对象数组的时候需要调用构造函数。如果对象数组有100个元素,就需要调用100次构造函数。   (2)如果对象数组所属类有带参数的构造函数时,可用初始化列表按顺序调用构造函数,使用复制初始化来初始化每个数组元素。   Point A[3]={Point(0,0),Point(1,1),Point(2,2)}; //Point(int a=0,int b=0)   Point A[3]={Point(1),Point(2),Point(3)}; //Point(int a=0,int b=0)   (3)如果对象数组所属类有单个参数的构造函数时候,定义数组时可以直接在初值列表中提供实参。   Point A[3] ={1,2,3}; //Point(int a=0,int b=0)   等价与:   Point A[3]={Point(1),Point(2),Point(3)};   (4)如果对象数组在创建时没有初始化,则所属类要么有合成默认构造函数,要么定义无参数的构造函数或全部参数为默认参数的构造函数。   (5

const常量定义数组大小

邮差的信 提交于 2020-02-10 03:16:16
结果是不能编译通过,如下 大致意思是常量size2是用变量temp定义的,所以size2的值是不固定的,不固定的值当然是不能够用来定义数组的,因为编译器在编译的时候就需要知道给数组分配多大空间,而变量的值在运行时有可能变化。 将char str2[size2]这句去掉是可以编译通过的,这说明const常量是可以通过变量初始化的。只是在初始化之后就不可以再修改了。 这些规则其实都是编译器行为。 这个题让我想起了const与数据,指针的组合。 (1)常量数据: const int n, int const n (2)常量指针: int * const p (3)指向常量数据的指针: const int * p, int const * p (4)指向常量数据的常量指针: const int * const p, int const * const p 看的让人眼花缭乱,其实很好记, 在有*和const的情况下,先看*和const的位置,只有const在*之后,这个const修饰的才是指针,在*之前,这个const修饰的都是数据。所以常量指针只有一种表示(* const) 而在没有*和有*但const在*之前的情况下,const修饰的都是数据,所以(const *)这种情况修饰的一定是数据,而数据int与const的位置又有2种,int const,和const int。

PHP笔记

十年热恋 提交于 2020-02-10 02:45:10
//语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出。 /* 【命名规则】 */ 常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH 变量名建议用下划线方式分隔 // $var_name 函数名建议用驼峰命名法 // varName 定界符建议全大写 // <<<DING, <<<'DING' 文件名建议全小写和下划线、数字 // func_name.php 私有属性名、方法名建议加下划线 // private $_name _func 接口名建议加I_ // interface I_Name /* 语言结构 */ array(), echo(), empty(), eval(), exit(), isset(), list(), print(), unset() echo, print 可省略括号。 /* 预定义常量 */ PATH_SEPARATOR //路径分隔符(Windows为分号,类Unix为冒号) DIRECTORY_SEPARATOR //目录分隔符 PHP_EOL //当前系统的换行符 PHP_VERSION //PHP版本号 PHP_OS //PHP服务操作系统 PHP_SAPI //用来判断是使用命令行还是浏览器执行的,如果 PHP_SAPI=='cli' 表示是在命令行下执行 PHP_INT_MAX

指针数组和数组指针

ⅰ亾dé卋堺 提交于 2020-02-09 18:17:43
先写一个 数组指针 int arr [ 3 ] [ 5 ] ; //这是一个普通的二维数组 int ( * p ) [ 5 ] ; //这是一个指向数组的指针 下标优先级高于间接访问,但是由于括号的存在,首先执行的还是间接访问。所以,p 是个指针,一个指向整型数组的指针。在声明中加初始化就是下面这个样子: int ( * p ) [ 5 ] = arr ; 换句话说,这里的指针表示二维数组的行 下面说一下 指针数组 // 举个例子,现在我有以下元素需要存在数组里 // do while return register // 当然我可以写一个二维数组: char arr [ 4 ] [ 9 ] = { "do" , "while" , "return" , "register" } ; // 也可以用一个指针数组这样表示: char * api [ 4 ] = { "do" , "while" , "return" , "register" } ; 显然,这里的指针表示的是二维数组的列 总结一下:数组指针只有一个指针,而指针数组可以有多个指针;数组指针里边的指针表示的是数组的行,而指针数组里面的指针表示的是二维数组的列;都表示二维数组。 来源: CSDN 作者: 楚渐灵 链接: https://blog.csdn.net/qq_43747991/article/details