数组有两个特性:
- 不允许拷贝:无法以值传递的方式使用数组形参
- 使用数组时通常都会转换为指针:当我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针。
- 传参的方法
当下有一个数组int j[2]={0,1}
,我们自写了一个函数void FindSomeOne()
,要求将数组参数传进去。
有以下两种方式(在函数内部使用时,Point++
即可实现指针的移动)
void FindSomeOne(const int* Point)
void FindSomeOne(const int Point[])
当我们使用此函数时这样写即可,FindSomeOne(j)
。至于形参传递为什么是const int *
,是因为我们往往是使用数组里的数据,但并不该表改数组存放的数据,当然修改具体值的时候,只需在形参传递的时候去掉const就可以了。
- 数组大小
数组是以指针的形式传递给函数的,所以函数并不知道数组的确切尺寸,因此调用者应该为此提供一些信息,以防止使用时数组越界。最好的方法是使用标准库规范传参数组是以指针的形式传递给函数的,所以函数并不知道数组的确切尺寸,因此调用者应该为此提供一些信息,以防止使用时数组越界。最好的方法是使用标准库规范传参数组是以指针的形式传递给函数的,所以函数并不知道数组的确切尺寸,因此调用者应该为此提供一些信息,以防止使用时数组越界。最好的方法是使用标准库规范传参数组是以指针的形式传递给函数的,所以函数并不知道数组的确切尺寸,因此调用者应该为此提供一些信息,以防止使用时数组越界。最好的方法是使用标准库规范传参
void FindSomeOne(const int *beg,const int *end)
{
while(beg!=end){
cout<<*beg++<<endl;
}
}
const int *a
和int *const a
的区别
const属于修饰符,关键是看const修饰的位置在哪里
const int *a
这里const修饰的是int,而int定义的是一个整值。因此a指向的对象的值是不能通过a来修改的,但是a可以重新赋值(比方说a++),时期指向不同的对象
const int *a = 0;
const int b = 1;
int c = 1;
a = &b // 额外:注意不能通过a 来修改 b值
a = &c // 额外:虽然c本身不是一个常量
*a = 2 //error 为题就在这里,不能修改通过 *a 所指向的对象值,最后赋值得对象是c,因此不能通过*a 来修改c值。
int *const a
这里const修饰的是 a ,a代表的是一个指针地址。因此不能赋给a其他的地址值,但可以修改a指向的值,这有点和cont int *a相反的意味,例子就不说了
- 关于const的补充:
- const 对象的地址只能赋值给指向const 对象的指针* const 对象的地址只能赋值给指向const 对象的指针
- 指向const 对象的指针可以 被赋 以 一个非const 对象的地址
- 指向const 得指针常被用作函数的形式参数,保证被传递给函数的实际对象在函数得实际对象在函数中不会被修改
- 常量在定义后就不能被修改,所以它必须被初始化。未初始化的常量定义将导致编译错误(上面都是在说明const得问题,所以没有赋值,实际语句中要赋值的)