1.声明定义与内存分配
1.1一个由c/C++编译的程序占用的内存分为以下几个部分
(1)栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
(2)堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
(3)全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
(4)文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
(5)程序代码区
1.2
通过*声明的话是将指针存放在栈区域,具体指针指向的值可以在常量区,全局区或者堆上。
通过[]声明的话是将整个数组存放在栈区域,并且声明变量指向自身,即数组的第一个元素。
看一个一维数组的例子
#include <iostream>
using namespace std;
main()
{
char *c1 = "abc";
char c2[] = "abc";
char *c3 = ( char* )malloc(3);
// *c3 = "abc" //error
strcpy(c3,"abc");
c3[0] = 'g';
printf("%d %d %s\n",&c1,c1,c1);
printf("%d %d %s\n",&c2,c2,c2);
printf("%d %d %s\n",&c3,c3,c3);
getchar();
}
运行结果
2293628 4199056 abc
2293624 2293624 abc
2293620 4012976 abc
1.3如果用[]方式声明变量的话可以用{}来定义,比如char a[]={'a'.'b','c','d'},但是用*声明的则不可以。因为这种方式是数组的独特定义方式。
2.二位数组
以上是一维数组的例子,我们再来看看二维数组
2.1[][]声明
可以把这样声明的一个二维数组看作一个一维数组来看。数组的所有元素全部在栈区。
(1)首先,不可以用char a[][]或者char a[3][]声明数组,报错为array type has incomplete element type 即,第二维的数组的类型不明确。
(2)可以这样声明 char a[][3],但是声明的时候必须要为其赋初值,这样编译器才知道要为该数组在栈中分配多大的空间。
如下例:
#include <stdio.h>
int main()
{
char x[][2]={'1','2','3','4'};
printf("%c",*((char*)x));
printf("%c",*((char*)x+1));
printf("%c",*((char*)x+2));
printf("%c",*((char*)x+3));
}
运行结果为1234
(3)可以这样声明 char a[3][3],这个是最标准的二位数组声明,二位数组可以当作一维数组,通过指针来取值,如上例。
2.2[]*组合声明
(1)char *a[],这样的声明代表a是一个数组,数组每个元素是一个指针。如果[]中没有具体值的话,就需要赋初值,和char a[][3]的情况是一样的。因为char a[][3]代表一个数组,数组中每个元素都是一个长度为3的数组。
(2)char (*a)[],这样的声明代表a是一个指针,指向一个数组,这里的[]可以没有具体值,但是这样的情况栈中只存放一个指针,其他所有值在堆中。
2.3**声明
char **a 就是一个指向指针单元的指针,栈中只存放一个指针。
3.函数传值
在函数传值的时候,如果是要传一个二维数组的话,在函数的形参声明中最好的方式是char (*a)[3],如果用char **a进行形参声明的话会出现错误,因为形参数组无法识别第一维的大小,必须要在形参中声明第一维的大小。
分享到:
相关推荐
C语言中算法的思考与讨论,主要讲的是算法,是我搜集的
C语言课堂讨论交流PPT课件.pptx
通过研究不同C编辑器下的程序运行结构分析C语言中++运算的工作情况,以便在实践中应用。
《C语言的科学和艺术》集中讨论库和抽象的用法,这是当代程序设计技术中最基本的知识。作者使用库来隐藏C语言的复杂性,更加突出主题,使学生可以较好地掌握每一个主题的精髓。然后,进一步给出每个库的底层实现,...
C语言中变长数组的讨论.pdf
C语言中几个模糊问题的讨论.pdf
《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...
数据结构》(C语言版)的第1章综述数据、数据结构和抽象数据类型等基本概念;第2章至第7章从抽象数据类型的角度,分别讨论线性表、栈、队列、串、数组、广义表、树和二叉树以及图等基本类型的数据结构及其应用;第8...
C语言的科学和艺术--集中讨论库和抽象的用法,这是当代程序设计技术中最基本的知识。这里贴出里面的源代码!
为帮助读者理解相关概念,本书在讨论C语言及其标准库的各方面问题时,提供了许多实例和解释。在第一部分的各章中还提供了练习题,书后则给出了主要练习的解答。这些练习的主要目的是帮助读者理解C语言的基本机制及其...
《数据结构(C语言版)》的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排与1992年4月出版的《数据结构》(第二...
《算法:C语言实现(第1-4部分)基础知识、数据结构、排序及搜索(原...书中提供了用C语言描述的完整算法源程序,并且配有丰富的插图和练习,还包含大量简洁的实现将理论和实践成功地相结合,这些实现均可用在真实应用上。
C语言教学中指针作函数参数的讨论
为帮助读者理解相关概念,本书在讨论C语言及其标准库的各方面问题时,提供了许多实例和解释。在第一部分的各章中还提供了练习题,书后则给出了主要练习的解答。这些练习的主要目的是帮助读者理解C语言的基本机制及其...
C语言中的getchar和putchar的使用方法 getchar是以行为单位进行存取的。 当用getchar进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux下为组合键Ctrl+D)...
这是我们大一的几十道实验编程题,刚开始学的可以自己下载下自己编编看,有些会有些小难度,不过多练应该就差不多了
本课程内容取自清华大学出版社出版的《数据结构》(C语言版)中的第1至第7章、第9至第10章,其中第1章综述数据、数据结构和抽象数据类型等基本概念;第2章至第7章从抽象数据类型的角度,分别讨论线性表、栈、队列、串...
├─第12章 C语言中用户标识符的作用域和存储类.ppt ├─第13章 编译预处理和动态存储分配.ppt ├─第14章 结构体、共用体和用户定义类型.ppt ├─第15章 位运算.ppt ├─第16章 文件.ppt ├─第1章 程序设计基本...
本书涵盖了传统c语言、C89、C95、C99等所有C语言版本的实现,同时讨论了C++与C语言兼容的部分。全书自上而下介绍了C语言的词法结构、预处理器、声明、类型表达式、语句、函数和运行库,是所有C语言编程人员必备的...
在第三部分高级专题中,讨论了如何在算术上处理矩阵,了解了数字信号处理系统,以及其利用ANSI C编写CGI程序进行互联网编程等高级实用专题。 本书内容丰富、叙述清晰、循序渐进,同时每章自成体系