指针的基本概念
指针的作用: 可以通过指针间接访问内存
- 内存编号是从0开始记录的,一般用十六进制数字表示
- 可以利用指针变量保存地址
指针变量的定义和使用
指针变量定义语法: 数据类型 * 变量名;
int main() {
//1、指针的定义
int a = 10; //定义整型变量a
//指针定义语法: 数据类型 * 变量名 ;
int * p;
//指针变量赋值
p = &a; //指针指向变量a的地址
cout << &a << endl; //打印数据a的地址
cout << p << endl; //打印指针变量p
//2、指针的使用
//通过*操作指针变量指向的内存
cout << "*p = " << *p << endl;
system("pause");
return 0;
}
指针变量和普通变量的区别
- 普通变量存放的是数据,指针变量存放的是地址
- 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用
总结1: 我们可以通过 & 符号 获取变量的地址
总结2:利用指针可以记录地址
总结3:对指针变量解引用,可以操作指针指向的内存
1
#include <iostream>
using namespace std;
int main( )
{
char c = 'A' ;
char *cp = &c ; // A
cout << c << *cp << ',' ;
c = 'B' ;
cout << c << *cp << ',' ;
*cp = 'a' ;
cout << c << *cp << endl ;
}
2
#include <iostream>
using namespace std;
int main( )
{
int a=1, *p1;
float b=5.2, *p2;
char c='A', *p3;
p1 = &a;
p2 = &b;
p3 = &c;
cout << a << ',' << b << ',' << c << endl;
cout << *p1 << ','<< *p2 << ',' << *p3 << endl;
*p1 = *p1+1; // *p1等价于a
*p2 = *p2+2; // *p2等价于b
*p3 = *p3+3; // *p3等价于c
cout << a << ',' << b << ',' << c << endl;
}
3 指针变量交换
#include <iostream>
using namespace std;
int main( )
{
int x = 10 , y = 20 ;
int *p1 = &x ,*p2 = &y, *t ;
cout << *p1 << '\t' << *p2 << endl ;
t = p1; p1 = p2 ; p2 = t ; // A
cout << *p1 << '\t' << *p2 << endl;
}
#include <iostream>
using namespace std;
int main( )
{
int x = 10 , y = 20 ;
int *p1=&x ,*p2 = &y, t ;
cout << x << '\t' << y << endl ;
t = *p1; *p1 = *p2 ; *p2 = t ; // A
cout << x << '\t' << y << endl ;
}
4
#include <iostream>
using namespace std;
int main( )
{
int a, *p1;
float b, *p2;
double d, *p3;
p1=&a;
p2=&b;
p3=&d;
cout << "p1=" << p1 << endl;
cout << "p2=" << p2 << endl;
cout << "p3=" << p3 << endl;
}
5 swap
#include <iostream>
using namespace std;
void swap(int x, int y)
{
int t;
t = x ; x = y ; y = t ;
}
int main( )
{
int x=3, y=9;
swap(x, y);
cout<< x<< ',' << y <<endl;
}
指针作为参数
#include <iostream>
using namespace std;
void swap(int *px, int *py)
{
int t;
t = *px ; *px = *py ; *py = t;
}
int main( )
{
int x = 3, y = 9, *p1, *p2;
p1 = &x; p2 = &y;
swap (p1, p2);
cout<< x<<endl;
cout<< y<<endl;
}
6
#include <iostream>
using namespace std;
void lowterm(int *num , int *den)
{
int n , d , r ;
n = *num ; // *num间接访问a
d = *den ; // *den 间接访问b
while(d != 0 ) // 用辗转相除法,求分子、分母的最大公约数
{ r = n%d ; n = d ; d = r ; }
if(n>1) // 当最大公约数n大于1时,用n除分子、分母
{
*num = *num/n ;
*den = *den/n ;
}
}
int main( )
{
int a = 14, b = 21; // a是分子,b是分母
cout << "分数:" << a << '/' << b << endl ; // 输出分数
lowterm(&a, &b) ;
cout << "约简后:"<< a << '/' << b << endl ; // 输出约简后的分数
}
7 一维数组与指针
#include <iostream>
using namespace std;
int main( )
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, *p = a, sum = 0, i;
for( i=0; i<10; i++)
sum = sum + *(p+i);
for( i=0; i<10; i++, p++) //
cout << *p<<'\t';
cout << endl << "sum=" << sum << endl;
}
2
#include <iostream>
using namespace std;
int main( )
{
int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, *p, sum=0 ;
for(p = a ; p < a+10; p++) // 此循环结束后,p指向a[9]之后的存储空间
sum = sum + *p ;
for(p = a; p < a+10; p++) // 此循环初始时,需重新给p赋初值
cout << *p<<'\t';
cout << endl << "sum=" << sum << endl;
}
利用指针反转数组
#include <iostream>
using namespace std;
int main( )
{
int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, t;
// 首地址
int *p1=a, *p2=a+9 ;
while(p1<p2)
{
t = *p1; *p1 = *p2; *p2=t;
p1++; p2 -- ;
}
for(p1 = a; p1 < a+10; p1++)
cout << *p1 << "\t";
cout << endl;
}
using namespace std;
void reverse( int b[ ], int n )
{
int i=0, j= n-1, t;
while(i<j )
{
t=b[i]; b[i]=b[j]; b[j]=t;
i++; j--;
}
}
int main(void)
{
int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, i;
reverse(a, 10);
for(i=0; i<10; i++) cout << a[i] << "\t ";
cout << endl;
}
逆序
void reverse( int b[], int n )
{
int t;
int *p2 = b+n-1;
while( b < p2 )
{
t = *b; *b = *p2; *p2=t;
b++; p2 --;
}
}
int main()
{
int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, i ;
reverse(a+3, 6);
for(i=0; i<10; i++)
cout << a[i] << "\t" ;
cout << endl ;
}
部分逆序存放
// 部分逆序存放
void reverse( int b[], int n )
{
int t;
int *p2 = b+n-1;
while( b < p2 )
{
t = *b; *b = *p2; *p2=t;
b++; p2 --;
}
}
int main()
{
int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, i ;
reverse(a+3, 6);
for(i=0; i<10; i++)
cout << a[i] << "\t" ;
cout << endl ;
}
求前十和 和后10 和
#include <iostream>
using namespace std;
int fsum(int *array, int n) // 通用的求和函数
{
int i, s=0;
for(i=0; i<n; i++)
s+=array[i];
return(s);
}
int main( )
{
int a[15]={ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
int shead, stail;
shead = fsum(a, 10); // 第1次调用 55
stail = fsum(&a[5], 10); // 第2次调用 6,7,8,9,10,11,12,13,14,15
cout << shead << ", " << stail << endl ;
}
数组最大值和最小值
#include <iostream>
using namespace std;
void max_min_value (int *array, int n, int *maxp, int *minp)
{ //maxp指向主函数max变量,minp指向主函数min变量
int *p, *array_end;
array_end = array + n ;
*maxp=*minp=*array ; // 假定第0个元素既是最大值又是最小值
for(p = array+1; p < array_end; p++)
{
if( *p>*maxp ) *maxp=*p;
else if( *p<*minp ) *minp=*p;
}
}
int main( )
{
int i, number[10], *p = number, max, min;
for(i = 0; i < 10; i++)
cin >> *( p+i ); // 输入数组元素值
max_min_value( p, 10, &max, &min );
for(i = 0; i < 10; i++)
cout << *( p+i ) << "\t" ; // 输出数组元素值
cout << "max value = " << max << "min value = " << min << endl ;
}
t通过指针访问数组元素, 实现选择排序法
#include <iostream>
using namespace std;
void sortd(int *a, int n)
{
int *p, *q, *maxp, t;
for( p = a; p < a + n -1; p++)
{
maxp = p;
for( q = p+1; q < a + n; q++)
if( *q > *maxp ) maxp = q; // 排降序
if( maxp != p )
{ t= *p; *p=*maxp; *maxp=t; }
}
}
int main( )
{
int i, a[10];
for(i = 0; i < 10; i++)
cin >> *( a+i ); // 输入数组元素值
sortd( a, 10 );
for(i = 0; i < 10; i++)
cout << *( a+i ) << '\t'; // 输出排序后的数组元素值
cout<<endl;
}
字符串追加
#include <iostream>
#include <cstring>
using namespace std;
int main( )
{
char a[20] = "ABCD", b[10] = "EFG";
int i, j;
i = strlen(a); // i是字符串a的长度,也是 '\0' 字符的下标
for(j = 0; b[j] != '\0'; i++, j++)
a[i] = b[j];
a[i] = '\0';
cout << a << endl ;
}
//解2:用字符指针访问方式实现
int main( )
{
char a[20] = "ABCD", b[10] = "EFG";
char *pa = a, *pb = b; // pa指向a[0],pb指向b[0]
while(*pa != '\0') pa++; // 循环结束后,pa指向a 尾部的'\0'
while(*pb != '\0')
{
*pa = *pb;
pa++; pb++;
}
*pa = '\0';
pa = a;
cout << pa << endl; // 请注意输出字符指针的意义
}
网友评论