`
godfrey90
  • 浏览: 56089 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

c语言中 *和[]的讨论

    博客分类:
  • c++
阅读更多
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语言的毕业论文题目100个.docx

    5. **C语言编程技巧在学习过程中的应用**:讨论C语言编程的最佳实践,如内存管理、错误处理和优化技术。 6. **C语言的优势分析**:比较其他编程语言,探讨C语言在系统编程、嵌入式开发和性能敏感应用上的优势。 7....

    c语言学习电子书.rar

    1. **C语言简介**:介绍C语言的历史背景、发展过程和主要特点,以及在软件开发中的重要地位。 2. **基本数据类型**:讲解C语言中的整型、浮点型、字符型等基本数据类型,以及它们的存储大小和使用方式。 3. **变量...

    C语言编写的雨中小伞游戏源程序

    1. **基本数据类型**:C语言中的`int`, `char`, `float`, `double`等,用于定义变量,存储游戏状态和用户输入。 2. **控制结构**:如`if...else`语句用于条件判断,决定游戏进程;`for`和`while`循环用于实现重复...

    《C语言程序设计》课程思政教学改革教学设计.docx

    * 课堂讨论法是教学中的一种常用方法,用于鼓励学生的交流和讨论。 知识点8:教学评价 * 教学评价旨在评估学生的学习成果和教学效果。 * 该评价涵盖了学生的学习过程、教学方法和教学效果等多个方面。

    c语言课件(完整版)

    在C语言中,数组的概念和操作需要熟练掌握,包括一维数组、二维数组和多维数组,以及数组作为函数参数的传递。 7. **函数**:函数是C语言中实现模块化编程的工具,用于封装代码和实现特定功能。函数的定义、调用、...

    C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解

    在C语言中,指针是编程中的一个重要概念,它允许我们直接操作内存地址。当我们讨论`int *p=0;`和`int *p;*p=0;`以及"&"的关系和区别时,我们需要深入理解指针的声明、初始化、解引用以及取地址操作。 首先,`int *p...

    C语言学习和教学课件(PPT)(清华大学 谭浩强版)

    9. **字符串**:讨论C语言中的字符串处理,如字符串常量、字符数组和字符串函数(strcpy, strcat, strcmp等)。 10. **结构体与联合体**:介绍结构体和联合体的定义、使用,以及结构体数组和指针。 11. **预处理器...

    C语言程序设计-精选习题和案例

    《C语言程序设计-精选习题和...这些题目旨在锻炼读者的编程思维和实际操作能力,帮助他们在实践中深化对C语言的理解。每个题目都涉及特定的知识点,通过解决这些题目,读者可以逐步掌握C语言的各项技能,提升编程水平。

    C语言100多个常见问题解答

    提供学习交流”,进一步强调了这份资料是专门针对C语言的学习者准备的,不仅涵盖了100多个常见问题,还鼓励学习者之间的交流和讨论。 ### 标签解析 - **C**: 指的是C语言本身。 - **C++**: 虽然与C语言密切相关,但...

    北京大学C语言教学大全

    - **面向对象编程的演进**:C++是在C语言的基础上发展起来的一种面向对象的编程语言,它继承了C语言的特性,并增加了类、对象等概念,使得程序设计更为模块化和复用性更强。 #### 二、C语言教程内容概览 1. **...

    C语言教材Word版

    C语言,作为计算机科学中的基础编程语言,对于理解计算机工作原理和后续学习其他高级语言具有重要的作用。以下是该教材可能涵盖的一些关键知识点: 1. **C语言简介**:介绍C语言的历史、特点和应用领域,解释为什么...

    C语言精彩编程200例.rar

    - 变量与数据类型:了解C语言中的基本数据类型,如int、char、float等,以及如何声明和初始化变量。 - 运算符与表达式:涵盖算术运算符、比较运算符、逻辑运算符等,以及它们在表达式中的应用。 - 控制结构:学习...

    C语言点滴-赵岩.docx

    - **2.1.2 C语言的今天**:概述了C语言在当前编程领域的地位和应用领域。 - **2.2 如何学好C语言**:提供了一些建议,如阅读经典书籍、编写实践代码等。 - **2.3 开发平台**:介绍了几种流行的C语言开发环境,如...

    C语言程序设计课件.rar

    1. **C语言简介**:介绍C语言的历史、特点和适用范围,解释为什么C语言在软件开发中如此重要。 2. **基本语法**:讲解C语言的基本语法元素,如变量、数据类型、运算符、控制结构(如if-else、switch、for、while...

    C语言教程 Word版

    13. **错误处理与调试**:讨论如何识别和处理程序中的错误,以及使用调试工具的基本方法。 14. **编程实践**:通过丰富的实例和练习题,引导读者将所学知识应用于实际编程。 这份"谭浩强C语言word版"教程,不仅...

    C语言书籍一览

    - 《Effective C》:Scott Meyers的"Effective"系列书籍之一,讨论了C语言中的最佳实践和常见误区,有助于提升编程技巧。 3. **高级C语言书籍** - 《C++ Primer》:虽然书名带有"C++",但Lippman, Lajoie, and ...

Global site tag (gtag.js) - Google Analytics