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] 。