数组声明
int myArray[10];
#include<iostream>
using namespace std;
int a[100] ;
int main(){
a[110] = 1; //不会报错
cout<<a[110]<<endl;
cout<<sizeof(a) / sizeof(int) <<endl; //长度为100
return 0;
}
数组初始化
只有定义数组时才能使用初始化,此后就不能用,且不能将一个数组赋值给另一个数组,但之后可以给数组元素赋值
int cards[4] = {3, 6, 8, 10}; //okay
int hand[4]; //okay
hand[4] = {5, 6, 7, 9}; //not allowed
hand[3] = 9; //okay
hand = cards; //not allowed
int a[6] = {1, 2, 3};
for(int i =0;i<6;i++)
cout<<a[i]<<endl; // 1 2 3 0 0 0
int a[] = {1, 2, 3}; //okay ,数组长度为3
cout<<sizeof(a)/sizeof(int)<<endl;
int a[]; // not allowed
}
地址运算符 & 可获得变量的地址
//地址运算符的使用
int c[] = {1, 2, 3};
cout<<"c[0] address: "<<&c[0]<<endl; //0x6ffe00
cout<<"c[1] address: "<<&c[1]<<endl; //0x6ffe04
cout<<"size of int: "<<sizeof(int)<<endl; //4 int 32位 4Byte
一种新的变量 指针–用于存储值的地址,通过 * 运算符可以获得该地址处的变量
两个恒等式(p:指针变量 a:变量):
*p = a
&a = p
//指针变量的定义与使用
int a = 6;
int* p; // 指针(变量)的声明
p = &a; // 指针(变量)的赋值 可直接写为 int* p = &a;
cout<<"two ways to express value"<<endl;
cout<<a<<endl; //6
cout<<*p<<endl; //6
cout<<"two ways to express address"<<endl;
cout<<&a<<endl; //0x6ffe14
cout<<p<<endl; //0x6ffe14
在这里,*p的类型为int, 而p的类型为指向Int的指针
不同类型的长度不同,不同数据类型的指针(地址)长度相同
//指针变量的加减
int a[3] = {1, 2, 3};
double d[3] = {4.5, 5.5, 6.5};
int* p_a = a;
double* p_d = d;
cout<<"p_a: "<<p_a<<" *p_a= "<<*p_a<<endl;
cout<<"p_a+1: "<<p_a+1<<" *(p_a+1)= "<<*(p_a+1)<<endl; // 指针变量加1, 增加的量等于它指向的字节树
cout<<"p_d: "<<p_d<<" *p_d= "<<*(p_d)<<endl;
cout<<"p_d+1: "<<p_d+1<<" *(p_d+1)= "<<*(p_d+1)<<endl;
cout<<endl<<"sizeof int= "<<sizeof(int)<<endl;
cout<<"sizeof double= "<<sizeof(double)<<endl;
指针的错误使用,一定要在使用指针之前给出一个确定的地址
int* p;
*p = 23; //错误
cout<<*p<<endl;
C++将数组名解释成数组第一个元素的指针
int a[3] = {1, 2, 3};
cout<<"a是什么? "<<a<<endl;
int* p = a;
cout<<"p= "<<p<<endl;
两个恒等式:
a[i] == *(a+i)
&a[i] == a+i
double a[3]={10000.0, 20000.0, 30000.0};
cout<<"两种遍历数组的方法"<<endl;
for(int i=0;i<3;i++)
cout<<a[i]<<endl;
for(int i=0;i<3;i++)
cout<<*(a+i)<<endl;
]
cout<<"看一下数组的地址"<<endl;
for(int i=0;i<3;i++)
cout<<a+i<<endl;
void swap(int x, int y){ //这里的x,y是普通变量
int temp=x;
x = y;
y = temp;
}
void swap2(int* x, int* y){ //这里的x,y是指针变量,也就是地址
int temp = *x;
*x = *y;
*y = temp;
}
int main(){
int a=1, b=2;
swap(a, b);
cout<<"a= "<<a<<" b= "<<b<<endl;
swap2(&a, &b); //传递地址 相当于 int* x = &a
cout<<"a= "<<a<<" b= "<<b<<endl;
}
void printArray(int a[4], int n){
for(int i=0;i<n;i++){
cout<<a[i]<<endl;
}
}
void printArray2(int a[], int n){
for(int i=0;i<n;i++){
cout<<a[i]<<endl;
}
}
void printArray3(int *a, int n){
for(int i=0;i<n;i++){
cout<<a[i]<<endl;
}
}
int main(){
int a[3]={1, 2, 3};
printArray3(a, 3);
}
将数组作为函数的参数,实际上并没有将数组的内容传递给函数,而是将数组的地址(指针)传递给函数
一维数组作为函数的输出
void getAbs(int a[], int n){
for(int i=0;i<n;i++){
if(a[i]<0) a[i]=-a[i];
}
}
void printArray(int a[], int n){
for(int i=0;i<n;i++){
cout<<a[i]<<endl;
}
}
int main(){
int a[3]={1, -2, 3};
getAbs(a, 3);
printArray(a, 3);
}
void swap(int x, int y){ //这里的x,y是普通变量
int temp=x;
x = y;
y = temp;
}
void swap2(int* x, int* y){ //这里的x,y是指针变量,也就是地址
int temp = *x;
*x = *y;
*y = temp;
}
int main(){
int a=1, b=2;
swap(a, b);
cout<<"a= "<<a<<" b= "<<b<<endl;
swap2(&a, &b); //传递地址 相当于 int* x = &a
cout<<"a= "<<a<<" b= "<<b<<endl;
}
指针
int n = 3; //普通变量
取地址运算符&:
&n: n的地址
指针变量:存储地址的变量
声明 int* p
赋值 p = &n
或连在一起 int* p = &n
两个恒等式
*p = n (都是数值)
p = &n (都是地址)
数组与指针
int a[3] = {1, 2, 3}; //数组
a : 指针变量, 是数组第一个元素的地址
*p = a //指针变量赋值给指针变量
两个恒等式
a[i] = *(a+i) 数组第i个元素的数值
&a[i] = a+i 数组第i个元素的地址
两种遍历数组的方法
for(int i=0;i<n;i++)
cout<<a[i]<<endl;
cout<<*(a+i)<<endl;
数组与函数
<--一维数组-->
函数声明
void func(int a[], int n) //数组地址,数组长度n
函数内对数组的操作会作用与原数组
函数的使用:
a[5] = {1, 2, 3, 4, 5};
func(a, 5);
printArray(a, 5);
<--二维数组-->
函数声明
void func(int a[][4], int m) //必须指明数组的列数 ?行数行吗,好像不行
函数使用
a[][4] ={..};
func(a, 3);
#include <iostream>
#include <iomanip>
#define m_num 4 //m_num 不能和变量m冲突
using namespace std;
//输入成绩函数 n个人 m科成绩
void input(double a[][m_num],int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
cin>>a[i][j];
}
}
//平均函数:——我要返回ave[i]这个数组,怎么返回?
void fun(double (*a)[m_num], double ave[], int n, int m) //n行m列
{
//int i,j;
double sum;
for(int i=0;i<m;i++){
sum=0.0;
for(int j=0;j<n;j++){
sum+=a[j][i];
}
ave[i]=sum/(double(n));
}
}
void output(double a[][m_num],double ave[], int n, int m)
{ int i,j;
for(j=0;j<m;j++)
//cout<
cout<<"第"<<j+1<<"科的平均成绩"<<ave[j]<<endl;
}
//主函数:
int main()
{
int n;
cout<<"输入有多少人"<<endl;
cin>>n;
double a[n][m_num];
double ave[m_num]={0};
cout<<"输入每个人成绩"<<endl;
input(a,n,m_num);
fun(a,ave,n,m_num);
output(a,ave,n,m_num);
}
引用:已定义的变量的别名(相同内存单元)
& 的两种含义:1.取地址符 2.引用
int a = 1;
int *p = &a; //取地址符,声明指针变量
int &b = a; //声明引用变量
int a;
int &b = a; //引用的声明,必须在声明引用时将其初始化,引用不能赋值
这里的 int& 指的是指向int的引用, b和a指向相同的值和内存单元,改变其中一个另一个也会改变
int a = 1;
int &b = a;
cout<<"a="<<a<<", b="<<b<<endl; //a=1, b=1
a++;
cout<<"a="<<a<<", b="<<b<<endl; //a=2, b=2
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
int main(){
int a=1, b=2;
swap(a, b);
cout<<a<<b<<endl;
}