用指针打印一个数组的全部元素:
#include<iostream>
using namespace std;
int main()
{
int i=0;
int arr[8];
for(i=0;i<8;i++)
arr[i]=i;
int *p;
i=0;
for(p=arr;i<8;p++)
{
cout << *p << " " ;
i++;
}
return 0;
}
当一个字符指针指向一个字符串时,表示如下;
char * str="C++ string";
定义了一个字符指针str,并将其初始化为字符串C++ string的首地址。
对字符串中的字符进行存取时,既可以采取数组下标的方式,也可以采取指针的方式。例:
#include<iostream>
using namespace std;
int main()
{
int i=0;
char arr[]={"C++ ,String Arrary"};
char* p1,* p2;
p2="C++,String";
i=1;
for(p1=arr;*p1!='\0';p1++)
{
cout << *p1;
i++;
}
cout << endl;
cout << "there are" << i << "characters"
<< "in the string above" << endl;
cout << "the char ponter p2 is pionter to "
<< "string\""<< p2 << "\"." << ",";
cout << "*p2=" << *p2 << ",";
cout << "p2[6]=" << p2[6] << endl;
return 0;
}
结果。
·指针数组,数组指针和多级指针。
指针数组定义:就是指针的集合,每个元素均为指针类型,即有指针变量构成数组。
例如: double * pArray[6] ;
下面实现一个简单的要求用户输入密码并进行验证的程序:
#include<iostream>
using namespace std;
int main()
{
int accNO;
int pss;
char* pMessages[5]=
{
"hello,welcome to the system!",
"enter you accout number:",
"password:",
"invalid accout number or password is wrong ,please try again.",
"thank you for your visit.bye!",
};
cout << pMessages[0] << endl;
cout << pMessages[1];
cin >> accNO;
cout << pMessages[2];
cin >> pss;
while(accNO>1000||pss!=123)
{
cout << pMessages[3] << endl;
cout << pMessages[1];
cin >> accNO;
cout << pMessages[2];
cin >> pss;
}
cout << pMessages[4];
return 0;
}
运行结果:
多级指针:指向指针的指针。
char ** pPointer;
指向指针的指针的运算与指针运算完全相同。需要注意的是,因为指向指针的指针层次很父子,使用是时候要小心。注入*ppointer这样的语句代表的是一个指针,仍然可以进行指针运算。下面一个列子:
#include<iostream>
using namespace std;
int main()
{
int i;
char* pArray[7]=
{
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday",
"sunday"
};
//定义一个指向指针的指针
char** pPointer;
pPointer=pArray;
cout << "here are the seven days of a week:" << endl;
for(i=0;i<7;i++)
{
cout << "day"<< i+1 << ":";
cout << *pPointer << endl;
pPointer++;
}
return 0;
}
运行结果: 原理图:
--------指针作为函数参数:当指针作为函数参数时候,从本质上来说,它仍遵循值传递的原则,即形参指针只是实参指针的一个副本。但是,由于指针的地址的特征,当使用“*”运算符时候,形参指针和实参指针指向同一个内存区域,从而可以在函数体内改变实参指针多指向的变量的值。
所以,当程序需要改变参数值时,往往将参数的地址作为参数传递给函数,以便使函数能够修改产生的值。
--------数组名作函数参数。
用数组名做函数参数与用数组元素作实参不同。
1、用数组名做函数参数时,要求形参和性对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时候,就会发生错误。
2、在用数组名做函数参数时,并不是进行的值的传递,既不是吧实参数组每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。它传递只是地址的传递,也就是吧实参数组的首地址赋予形参数组名。形参数组名取得该首地址后,也就等于有了实际存在的数组。实际上,形参数组跟实参数组为同一个数组,共同拥有一段内存空间。例如:
#include<iostream>
using namespace std;
void PrintArray(int a[8] );// void PrintArray(int a[]);
int main()
{
int test[8];
int i;
for(i=0;i<8;i++)
{
test[i]=i;
}
for(i=0;i<8;i++)
{
cout << test[i] << " ";
}
PrintArray(test);
cout << "after change" << endl;
for(i=0;i<8;i++)
{
cout << test[i] << " ";
}
return 0;
}
void PrintArray(int a[8])// void PrintArray(int a[]);
{
int i;
for(i=0;i<8;i++)
{
a[i]=a[i]+1;
}
}
运行结果:
一定要记住函数声明,主函数,函数定义。一定要注意形参跟实参数组类型必需一致。
-