C++中有关数组的相关问题

时间:2022-05-07 15:49:25

1、数组长度相关:

strlen(from <string.h>)只是针对字符数组才有的,他不包含\0的长度。无法对其他类型求长度。sizeof()则可以对\0发起作用。记住(a.length()这不是c++语言)

获取数组长度方法:

方法1:

sizeof(array) / sizeof(array[0]);

方法2:

在C语言中习惯上在使用时都把它定义成一个宏:

#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));}

而在C++中则可以使用模板技术定义一个函数,比如:

方法3:

template <class T>

int getArrayLen(T& array)

{

return (sizeof(array) / sizeof(array[0]));

}

【C语言】

#include <stdio.h>

#include <stdlib.h>

#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));}

//定义一个带参数的宏,将数组长度存储在变量len中

int main()

{

  char a[] = {'1','2','3','4'};

  int len;

   GET_ARRAY_LEN(a,len)

  //调用预定义的宏,取得数组a的长度,并将其存储在变量len中

  printf("%d\n",len); // 输出为4

  system("pause");

  return 0;

}

【C++】

#include <iostream>

using namespace std;

template <class T>

int getArrayLen(T& array) //使用模板定义一个函数getArrayLen,该函数将返回数组array的长度

{

  return (sizeof(array) / sizeof(array[0]));

}

int main()

{

  char a[] = {'1','2','3'};

  cout << getArrayLen(a) << endl;//输出为3

  return 0;

}

2、数组的输出相关:

#include<iostream>
using namespace std;
int main(){
  int a[]={1,2,3,4,5,6,7,8};
  cout<<a<<endl; //可以输出整个数组,和之前的不一样,之前的只是把a当做第一个地址输出
  cout<<&a[0]<<endl;//第一个元素首地址
  cout<<&a<<endl;//数组的地址和第一个元素的地址一样

cout<<a+1<<endl;//结果为 下一个元素的地址 *(a+1)也就是下一个元素

cout<<&a+1<<endl;//获取数组名的地址在+1,这个偏移是整个数组的大小

  cout<<&a[0]+1<<endl;// 不一样,还是看作相隔一个元素
  return 0;
}

分析:

对于:

  int a[5]={1,2,3,4,5};

  int *ptr=(int *)(&a+1);
  printf("%d,%d",*(a+1),*(ptr-1));

原因如下:
  &a是数组指针,其类型为 int (*)[5]; 而指针加 1要根据指针类型加上一定的值, 不同类型的指针+1之后增加的大小不同,a是长度为 5的 int数组指针,所以要加 5*sizeof(int) 、所以 ptr实际是 a[5] ,但是 prt与(&a+1)类型是不一样的(这点很重要) ,所以 prt-1只会减去 sizeof(int*) a、&a的地址是一样的,
但意思不一样,a是数组首地址,也就是 a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即 a[1],&a+1是下一个对象的地址,即 a[5] 。