指针数组

char数组与char指针

旧时模样 提交于 2019-11-27 01:18:53
1、以字符串形式出现的,编译器会在结尾自动添加\0,思考,为什么?   存在的C语言方法,如strlen(s),计算字符串的长度,其中s指针。strlen要计算字符串长度,必须知道哪里是结尾,因此使用\0表示结尾。只有字符数组才有\0的概念,其它类型(int)的数组没有这个概念。因为其他类型的数组或者指针,没有strlen这种方法。   那么问题来了,int数组如何计算长度呢?如int a1 = {3,7,9,};   使用sizeof(a1)/sizeof(int)。 2、数组可以在栈上分配,也可以在堆上分配,但必须指定大小。   char a1[100]; //在栈上分配   char* pa = new char[100];// 在堆上分配,返回首元素的地址 3、char a1[] = "abc"; 相当于在栈顶分配4个字节,分别放上a,b,c,\0,等价于char a1 ={'a','b','c','\0'}; 4、char* pa = "abc"; 分析一下就知道,pa是char指针,"abc"是一个文本字符串,显然类型不吻合,需要适配。可认为编译器做了下面的事情:在常量区分配4个字节,分别放上a,b,c,\0,然后把a的地址返回给pa。   注意:文本字符串放在常量区,是不可修改的,试图修改,运行异常。那么在思考一下,既然右边是const,而pa并没有限定为const

char指针

喜夏-厌秋 提交于 2019-11-27 01:18:36
1、在C语言中,没有字符串类型,因此使用char指针表示字符串。 2、那么问题来了,使用char* 表示字符串,到哪里是结尾呢?因此需要一个特殊的字符作为哨兵,类似迭代器中的end(),这个哨兵就是'\0',注意不是字符0. 3、对于文本字符串,编译器会自动添加\0。 4、对于字符数组的赋值,如果不使用文本字符串,需要用户在尾部添加字符\0。对于其他类型的数组,没有\0的概念。 5、对于char指针,C语言提供了一系列方法,如strlen,strcmp。这些方法有个特点,都是假定最后一个字符为\0。因此对于char指针,我们要保证最后一个字符是\0。 6、考虑sizeof,对于指针,取值为4。对于数组名,虽然数组名也可以认为是指针,但是sizeof(数组名) 取值是整个数组占用的内存,而不是4。思考为什么?   int a[] = {1,3,5,7,}; 我怎么知道a中的元素个数。总不能让我数吧?   我知道每个int占用内存,要想知道元素个数,我需要知道整个数组占用的内存。因此,我需要sizeof(a)返回整个数组占用的内存大小。 7、char指针指向文本字符串,可以认为char指针是指向const对象的指针;char数组名,可以认为是常量指针,不允许修改指向。 8、sizeof(char数组名) :返回整个数组占用多少个字节,包括\0。   sizeof(char指针):返回4

C++ 数组

走远了吗. 提交于 2019-11-27 01:16:29
1、在栈上分配的数组,大小必须在编译时确定,也就是编译时常量。在堆上分配,大小可以是变量。思考,为什么?   在栈上分配数组,可以认为直接在栈顶挪出一块内存,必须直到大小。 2、数组名是一个指针常量,不能修改指向。 3、在大部分情况下,可以把数组名认为是一个指针(不能修改指向),但是有两种情况需要注意,数组名不是指针:a、sizeof(数组名)计算数组的长度;b、对数组名取地址&,返回的是数组首地址,也就是说&a和a相等。考虑指针的情况,对于sizeof(指针),大小是4个字节。对于指针,存在三个值:a、指针本身的地址,也就是指针存放在哪里;b、指针值,指针指向的地址;c、指针解引用,指向的对象。 4、对于数组名和指针,都可以使用下标,aa[i]等价于*(aa+i)。 5、如果数组名作为方法形参,数组名退化为指针,不再具有数组名的特性。数组传递,是浅拷贝,只是对指针传值。 6、考虑运算符优先级,优先级最高的运算符有(),[],.,->,第二优先级的运算符有++,--,*(解引用),&(取地址),需要注意的是这几个运算符优先级相同,但是结合性是从右向左,先计算++,--,再计算*解引用,&取地址。 7、数组与指针的结合。指向int的数组,声明为int aa[10]; 指向int指针的数组,声明为int* aa[10]; 那么int (*aa) [10],表示什么?   把(*aa

什么是指针

走远了吗. 提交于 2019-11-26 21:38:12
什么是指针 指针就就是数据的内存地址。 指针的作用一 当你需要在函数间传递大量数据时就用指针,因为可以降低的内存开销 指针的作用二 定义指针变量的格式 定义一个指针变量的方法 Examples: char *p; int *q; float *r; long double *s; long int *t; 没有初始化的指针 没有初始化的指针 1.没有初始化的指针,称之为野指针。 2.指针里面是一个随机的值。 3.野指针有很大的风险。 如何初始化一个指针? Answer: set it to NULL int *p; p = NULL; 或者 p = 0; 注意:永远不要使用一个空指针。 在C里,使用空指针会有一个空指针错误。会使得程序崩溃。 如何初始化一个指针? int a; int *p; p = &a; 代码演示 *pr = *pa + *pb; 如何通过指针去访问一个变量 For example: p = &a; c = *p + 43; 指针访问内存可以通过*这个操作符去访问所指向的内存空间。 特别注意: 1.永远不要返回一个指向本地变量的指针。 Why? float *mistake() { float temp = 12; return &temp; } 指针变量所占用的存储空间 为何指针变量要分类型? int i = 2; char c = 1; int *p =

深入 理解char * ,char ** ,char a[ ] ,char *a[] 的区别

岁酱吖の 提交于 2019-11-26 21:38:00
C语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了许多指针和数组的迷惑,因此,刻意再次深入探究了指针和数组这玩意儿, 其他类型的数组比较简单,容易混淆的是字符数组和字符指针这两个。。。下面就开始剖析一下这两位的恩怨情仇。。。  1 数组的本质    数组是多个元素的集合,在内存中分布在地址相连的单元中,所以可以通过其下标访问不同单元的元素。。  2 指针。    指针也是一种变量,只不过它的内存单元中保存的是一个标识其他位置的地址。。由于地址也是整数,在32位平台下,指针默认为32位。。  3 指针的指向?    指向的直接意思就是指针变量所保存的其他的地址单元中所存放的数据类型。    int * p ;//p 变量保存的地址所在内存单元中的数据类型为整型 float *q;// ........................................浮点型 不论指向的数据类型为那种,指针变量其本身永远为整型,因为它保存的地址。 4 字符数组。。。 字面意思是数组,数组中的元素是字符。。确实,这就是它的本质意义。 char str[10]; 定义了一个有十个元素的数组,元素类型为字符。 C语言中定义一个变量时可以初始化。 char str[10] = {"hello world"}; 当编译器遇到这句时,会把str数组中从第一个元素把hello

C 传递数组给函数

只谈情不闲聊 提交于 2019-11-26 20:26:07
C 传递数组给函数 如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为形式参数。 方式 1 形式参数是一个指针(您可以在下一章中学习到有关指针的知识): void myFunction(int* param) { . . . } 方式 2 形式参数是一个已定义大小的数组: void myFunction(int param[10]) { . . . } 方式 3 形式参数是一个未定义大小的数组: void myFunction(int param[]) { . . . } 实例 现在,让我们来看下面这个函数,它把数组作为参数,同时还传递了另一个参数,根据所传的参数,会返回数组中各元素的平均值: double getAverage(int arr[], int size) { int i; double avg; double sum; for (i = 0; i < size; ++i) { sum += arr[i]; } avg = sum / size; return avg; } 现在,让我们调用上面的函数,如下所示: 实例 #include <stdio.h> /* 函数声明 */ double getAverage(int

数据结构-链表(1)

大城市里の小女人 提交于 2019-11-26 19:59:00
链表是一种用于存储数据集合的数据结构。链表有以下几个属性: 相邻元素之间通过指针进行连接 最后一个元素的后继指针值为NULL 在程序执行的过程中,链表的长度可以增加或缩小 链表的空间能够按需分配(直到系统内存耗尽) 没有内存空间的浪费(但是链表中的指针需要一些额外的内存开销)    一、链表的分类   链表大致可以分为这么几类: 单向链表 双向链表 存储较为高效的双向链表 循环链表 松散链表 二、LRU缓存淘汰算法   在具体介绍链表之前,有必要先介绍一下关于LRU缓存技术:    缓存是一种提高数据读取性能的技术,在硬件设计,软件开发中都有着非常广泛的应用,比如常见的CPU缓存、数据库缓存、浏览器缓存等等。   缓存的大小是有限的,当缓存被用满的时,此时就需要对缓存做相应的清理,但是,具体哪些数据应该被清理出去?哪些数据应该被保留?这就需要缓存淘汰策略来决定。常见的策略有三种: 先进先出策略FIFO(First In ,First Out) 最少使用策略LFU(Least Frequently Used) 最近最少使用策略LRU(Least Recently Used)  那么接下来就有一个问题:如何使用链表来实现LRU缓存淘汰策略呢? 三、链表的底层存储结构   相比于数组来说,链表是一种稍微复杂一点的数据结构,下面是链表和数组的内存分部对比图:      从图中可以看出

[转] C语言的标准(K&R C, ANSI C, C89, C90, C99)

夙愿已清 提交于 2019-11-26 19:15:20
最近在学习C语言,喜欢对某一个问题进行深究,然后就晕了,C语言的各种规则也真是多,麻烦事也多。 比方,一直在VS2010平台上学习, 变量的声明就必须在执行语句的前面,否则就报错。但是以前在编写C++程序时,好像都是随意的。有点迷糊, 百度了一下,发现很多人提到C89 和 C99……由于C89(也就是C90)是目前广泛使用并完全支持的,C99目前支持的还不太全面, 所以还是将变量的声明放在执行语句前面比较妥。(20130906) 以下部分均转自网上 ———————————————————————————————————— C语言的标准(K&R C, ANSI C, C89, C90, C99) 0、C语言,1973年由Dennis M. Ritchie设计和实现。 1、 K&R C 。1978年由Kernighan和Ritchie合写的书《The C Programming Language》,形成了C语言的事实的标准,简称为K&R C。 2、 ANSI C ( C89 或 C90 )。1989年,美国国家标准局(ANSI)颁布了第一个官方的C语言标准(X3.159-1989),简称为ANSI C或C89;1990年,它被国际标准化组织(ISO)采纳国际标准(ISO/IEC9899:1990),简称为C90。 这个标准是目前广泛使用并完全支持的。 3、 C99 。199年,ISO

数组指针和指针数组的区别

我怕爱的太早我们不能终老 提交于 2019-11-26 18:43:44
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; for(i=0;i<3;i++) p[i]=a[i]; 这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p

数组指针和指针数组的区别

冷暖自知 提交于 2019-11-26 18:43:23
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a