数组类型与sizeof

以char类型为例:

char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char

char *p = a;    //p类型为 char*, *p类型为char。 类型char[100]可隐式到char*转化,为此:

#include <iostream>

void test(char *p) //即使形参为char p[]或char p[100]
{
    //p类型为char *,一指针类型。即使传递的实参类型是char[100],也会退化到char*
    std::cout << sizeof(p) << std::endl; //编译时计算,指针大小为4

    p[0] = ‘z‘;
}

int main()
{
    char a[100] = "abcdef";
    test(a);

    std::cout << a << endl;//"zbcdef"
    return 0;
}

形参可以改为char (*p)[100]或 char (&p)[100] ,必须要指定大小为100,因为char[100]不能转为char (&)[],char (*)[100]也不能转为char (*)[] ,你可能想定义a时改为char a[] = "abcdef";呢~~~不行a大小编译时计算,它的类型为char[7]而不是char[]

#include <iostream>

void test(char (*p)[100])
{
    std::cout << sizeof(*p) << std::endl; //形参已经显示指定大小了,可以肯定输出100了。

    (*p)[0] = ‘z‘;
}

int main()
{
    char a[100] = "abcdef";
    test(&a);

    std::cout << a << std::endl;//"zbcdef"
    return 0;
}

使用char (*p)[100]

#include <iostream>

void test(char (&p)[100])
{
    std::cout << sizeof(p) << std::endl; //形参已经显示指定大小了,可以肯定输出100了。

    p[0] = ‘z‘;
}

int main()
{
    char a[100] = "abcdef";
    test(a);

    std::cout << a << std::endl;//"zbcdef"
    return 0;
}

使用char (&p)[100]



传递指针变量时,有时可能需要传递的是指针的指针或指针的引用
有时,如果直接传递指针,如:

#include <iostream>

void AllocMem(char *p, int size)
{
    if(p != NULL)
        delete []p;

    p = new char[size];
}

int main()
{
    char *pstr = NULL;
    AllocMem(pstr, 100);

    //然而pstr依旧为NULL,执行下面的语句将运行出错
    //strcpy(pstr, "hello world");
    //...

    delete []pstr;
    return 0;
}

若传递指针的引用:

#include <iostream>

void AllocMem(char *&p, int size)
{
    if(p != NULL)
        delete []p;

    p = new char[size];
}

int main()
{
    char *pstr = NULL;
    AllocMem(pstr, 100);

    strcpy(pstr, "hello world");
    std::cout << pstr << std::endl;//正常输出 hello world

    delete []pstr;
    return 0;
}

#include <iostream>

void AllocMem(char **p, int size)
{
    if(*p != NULL)
        delete [](*p);

    *p = new char[size];
}

int main()
{
    char *pstr = NULL;
    AllocMem(&pstr, 100);

    strcpy(pstr, "hello world");
    std::cout << pstr << std::endl;//"hello world"

    delete []pstr;
    return 0;
}

指针的指针

时间: 2024-10-30 22:27:47

数组类型与sizeof的相关文章

”Java 方法可以返回数组类型“ 所想到的

在C和C++中不能返回一个局部变量,因为函数中的局部变量分配的存储空间在栈上,当函数执行完后会被重新利用,所以想要返回数组类型,有两种方式:1)静态变量(static in a function可以在函数调用之间保持值有效),2)利用malloc动态分配,但是最终要记得释放.下面是几个简单测试程序: 1.错误的示例: #include <stdio.h> int *func(int n){ int x = n *n; int a[] = {1,3,4,5,7}; a[0] = x; retur

c语言 数组类型

数组类型重命名数组类型由元素类型和数组大小共同决定数组指针是一个指针,只想对应类型的数组指针数组是一个数组,其中每个元素都是指针数组指针遵循指针运算法则指针数组拥有c语言数组的各种特性 c通过typedef 为数组类型重命名格式为 typedef type(name)[size] 数组类型:typedef int(aint5)[5] typedef float(afloat10)[10] 数组定义:aint5 iarray; //定义了一个数组afloat10 farray; //定义了一个数组

数组类型与数组指针的巧妙利用

本例通过存取结构, 慢慢引入了数组类型与指针的一些使用方法; 其中六个小例子的测试内容和结果都是一样的. unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls; type   TForm1 = class(TForm)     Button1: TButton;     Button2: TButton;

C++数组类型与函数类型

之所以将C++的数组类型与函数类型拿到一块说,是因为两者在很多地方都一样. 首先,声明形式上类似: 数组类型:  type [num]                                          数组:type name[num] 函数类型:  return_type (形参列表)    函数:return_type name(形参列表) 数组指针类型: type (*)[num] 数组指针:type (*name)[num] 函数指针类型: return_type (*)

使用typedef语句定义数组类型

使用typedef语句定义数组类型     1. 一维数组类型的定义格式 typedef <元素类型关键字><数组类型名>[<常量表达式>]; 例如: (1) typedef int vector[10]; (2) typedef char strings[80]; (3) typedef short int array[N]; 第一条语句定义了一个元素类型为int,含有10个元素的数组类型vector,若不使用typedef保留字,则就变成了数组定义,它只定义了一个元

怎么判断一个对象是不是数组类型?

前面<变量的赋值和对象的赋值>中有用到typeof运算符去判断运算数的类型,结果如下: alert(typeof 1); // 返回字符串"number" alert(typeof "1"); // 返回字符串"string" alert(typeof true); // 返回字符串"boolean" alert(typeof {}); // 返回字符串"object" alert(typeof

《JS权威指南学习总结--7.10 数组类型》

内容要点: 一.数组类型 判断它是否为数组通常非常有用.在ES5中,可以使用Array.isArray()函数来做这件事情: Array.isArray([]); //=>true Array.isArray({}); //=>false 二.类数组对象 JS数组的有一些特性是其他对象所没有的: 1.当有新的元素添加到列表中时,自动更新length属性. 2.设置length为一个较小值将截断数组. 3.从Array.prototype中继承一些有用的方法. 4.其类属性为"Arra

结构体,公用体,枚举类型的sizeof

1)枚举类enum型空间计算 enum只是定义了一个常量集合,里面没有“元素”,而枚举类型是当做int来存储的,所以枚举类型的sizeof值都为4 1 enum color(red,pink,white,black)c; 2 void main() 3 { 4 cout<<sizeof(enum); //值为4 5 } 2)公用体union空间计算 公用体中的成员公用同一段内存,所以整个联合体的sizeof是所有成员中占用内存最大的成员的sizeof,联合体要考虑内存对齐,具体规则下面会讲 1

Java-第十四章-代参的方法(二)-编程实现,输入班里10名学生的身高,获得身高最高的学生要求对象数组类型方法

package com.ww.yzpA; public class Students { int No; int Height; } package com.ww.yzpA; public class Height { public Students getMaxHeigth(Students[] str) { Students A = new Students(); for (int i = 0; i < str.length; i++) { if (str[i].Height > A.He