1 指针的概念
#include <iostream>
using namespace std;
/*
间接引用指针时,可获得该指针指向的变量内容
本部分参考内容:C++ 程序设计教程 钱能 清华大学出版社
*/
void zhizhen1()
{
int* iPtr;
int iCount=18;
//* 放在可执行语句中的指针之前,成为间接引用操作符
iPtr=&iCount;
//* 放在指针定义中时,称指针定义符
cout<<*iPtr<<endl;
cout<< iPtr<<endl;
*iPtr=58;
cout<< iCount<<endl;
cout<< iPtr<<endl;
}
void zhizhen2()
{
/*
*iPtr的类型是整数 ,指针iPtr指向该整数,所以iPtr的类型是整型指针,
而iPtr的地址(&iPtr) 的类型是整型指针的地址,即指向整型指针的指针。
指针的地址是二级指针
*/
int iCount=18;
int* iPtr=&iCount;
*iPtr=58;
cout<<iCount<<endl;//58
cout<<iPtr<<endl;//iCount所在的地址
cout<<&iCount<<endl;//iCount所在的地址
cout<<*iPtr<<endl;//iCount的值
//指针也是变量,是变量就具有的内存地址,所以指针 也有地址
cout<<&iPtr<<endl;// iPtr本身的地址
}
void zhizhen3()
{
int iCount=26;
int* iPtr=&iCount;
//指针值不是整型数
//* iPtr=(int)&iCount;
*iPtr=50;
}
void zhizhen4()
{
//指针的初始化,指针变量的初始化的值为该指针类型的地址值
//不要将 int* iPtr=&iCount与 * iPtr=&iCount混搅
//前者是定义语句,*是指针定义符,C++为iPtr指针分配一个指针空间,并用iCount的地址初始化
//后者是赋值语句,左右两边地址不匹配
//指针要在使用前初始化
int iCount;
int* iPtr=&iCount;//初始化未整型地址
*iPtr=58;
cout<<*iPtr<<endl;//iCount的值
cout<<iCount<<endl;
}
void zhizhen5()
{
//指针类型与实际存储的匹配
//指针是有类型的 ,给指针赋值,不但必须是一个地址,而且应该是一个该指针类型相符的变量或变量地址
//指针具有一定的类型,它的值为地址的变量,该地址是内存中另 一个该类型变量的存储位置,或者说指针是具有某个类型的地址
float f=34.5;
float* fPtr=&f;
float* f1Ptr;
//int* iPtr=&f;// [Error] cannot convert 'float*' to 'int*' in initialization
cout<<f<<endl;
//cout<<iPtr<<endl;
cout<<fPtr<<endl;
f1Ptr=fPtr;
cout<<*f1Ptr<<endl;
}
void zhizhen6()
{
//指针运算
//只有加法和减法可以进行指针运算
int aArray[10];
int sum=0;
int* iPtr=aArray;
cout<<sizeof(*aArray)<<endl;
char fArray[10];
cout<<sizeof(*fArray)<<endl;
for (int i=0;i<10;i++)
{
//a[i] 等价 *(a+i) 等价于 iPtr[i] 等价于*(iPtr+i)
//aArray[i]=i*2;
//*(iPtr+i)=i*2;
//iPtr[i]=i*2;
*(aArray+i)=i*2;
//指针和数组
//数组名可以直接拿来初始化指针,数组名就是数组第一个元素的地址。
//即对于数组a,有:a 定于&a[0]
// int a[100] ; int* iPtr=a;
//a[i] 等价 *(a+i) 等价于 iPtr[i] 等价于*(iPtr+i) 下标操作是针对地址而不仅仅是针对数组名
//&a[i]等价于a+i等价于iPtr+i等价于&iPtr[i]
}
for (int i=0;i<10;i++)
{
sum+=*iPtr;
cout<<"aArray 地址"<<iPtr<<endl;
cout<<"sum is"<<sum<<endl;
iPtr++;
//sum+=*(iPtr++) ;
}
cout<<"sum is"<<sum<<endl;
}
指针与数组
void zhizhen7()
{
int sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;
int iArray[]={1,4,2,7,13,32,21,48,16,30};
int* iPtr;
int size,n;
size=sizeof(iArray)/sizeof(*iArray);//元素个数
for (n=0;n<size;n++)
{
sum1+=iArray[n];
}
iPtr=iArray;
for (n=0;n<size;n++)
{
//cout<<*iPtr<<" "<<sum2<<endl;
sum2+=*iPtr++;
//sum2=sum2+*iPtr;
//iPtr++;
}
cout<<sum2<<endl;
iPtr=iArray;
for (n=0;n<size;n++)
{
sum3+=*(iPtr+n) ;
}
iPtr=iArray;
for (n=0;n<size;n++)
{
sum4+=iPtr[n];
}
iPtr=iArray;
for (n=0;n<size;n++)
{
sum5+=*(iArray+n);
}
cout<<sum1<<endl
<<sum2<<endl
<<sum3<<endl
<<sum4<<endl
<<sum5<<endl;
}
数组名是指针常量,区别于指针变量,所以给数组名赋值时错误的
对于编译器来说,数组名表示内存中分配了数组的固定位置,修改了这个数组名,就会丢失数组空间,所以数组名所代表的地址不能被修改。