一、指针是什么
我们知道定义一个变量,编译器会为它分配内存间,这个内存空间的地址就是指针。
注意:指针变量与指针是两个完全不同的概念,指针是地址,而指针变量是用来存储指针的变量。
总结来说指针就是变量的地址。
二、指针变量
2.1使用指针变量的例子
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int *p;
p = &a;
*p = 20;
cout << a << endl;
cout << p << endl;
return 0;
}
2.2怎样定义指针变量
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int *p;
p = &a;
cout << *p << endl;
}
2.3怎样引用指针变量
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int *p;
p = &a;
cout << *p << endl;
cout << p << endl;
}
2.4指针变量作为函数参数
#include <iostream>
using namespace std;
void swap(int *p1,int *p2)
{
int temp=*p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10;
int b = 20;
cout << a <<"\t"<< b << endl;
swap(&a, &b);
cout << a <<"\t"<< b << endl;
}
#include <iostream>
using namespace std;
void swap(int *p1,int *p2)
{
int *p=p1;
p1 = p2;
p2 = p;
}
int main()
{
int a = 10;
int b = 20;
cout << a <<"\t"<< b << endl;
swap(&a, &b);
cout << a <<"\t"<< b << endl;
}
三、通过指针引用数组
3.1数组元素的指针
#include <iostream>
using namespace std;
int main()
{
int a[5] = { 0, 1, 2, 3, 4 };
int *p;
p = &a[3];
cout << a[3] << endl;
cout << *p << endl;
}
3.2在引用数组元素时指针的运算
#include <iostream>
using namespace std;
int main()
{
int a[5] = { 0, 1, 2, 3, 4 };
int *p;
p = &a[3];
p += 1;
cout << a[3] << endl;
cout << *p << endl;
}
3.3通过指针引用数组元素
#include <iostream>
using namespace std;
int main()
{
int a[5] = { 0, 1, 2, 3, 4 };
int *p;
for (int i = 0; i < 5; i++)
{
cout << a[i] << "\t";
}
cout << endl;
for (int i = 0; i < 5; i++)
{
cout << *(a + i) << "\t";
}
cout << endl;
for (p = a; p < (a + 5); p++)
{
cout << *p << "\t";
}
cout << endl;
}
3.4数组名作函数参数
#include <iostream>
using namespace std;
void Display(int a[],int n)
{
for (int i = 0; i < n; i++)
{
cout << a[i] <<"\t";
}
cout << endl;
}
int main()
{
int a[5] = { 0, 1, 2, 3, 4 };
Display(a, 5);
}
3.5通过指针引用多维数组
3.5.1多维数组元素的地址
#include <iostream>
using namespace std;
int main()
{
int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
cout << (int)a << "\t" << (int)(a + 1) << "\t" << (int)(a + 2) << endl;
cout << (int)a <<"\t"<< (int)a[1] << "\t"<<(int)a[2] << endl;
cout << (int)*a << "\t" << (int)*(a + 1) << "\t" << (int)*(a + 2) << endl;
cout << int(a[1] + 0) << "\t" << (int)*(a + 1) + 0 << "\t" << (int)&a[1][0] << endl;
return 0;
}
3.5.2指向数组元素的指针变量
#include <iostream>
using namespace std;
int main()
{
int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
int *p;
for (p = a[0]; p < a[0] + 6; p++)
cout << *p << "\t";
cout << endl;
int(*pp)[3];
pp = a;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << *(*(pp + i) + j) << "\t";
}
cout << endl;
}
return 0;
}
3.5.3指向数组的指针作为函数参数
#include <iostream>
using namespace std;
void average(int *p, int n)
{
double sum = 0;
for (int i = 0; i < n; i++)
{
sum += *(p + i);
}
cout << sum / n << endl;
}
void select(int(*p)[3], int n)
{
for (int i = 0; i < 3; i++)
{
cout << *(*(p + n) + i) << "\t";
}
cout << endl;
}
int main()
{
int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
average(a[0], 6);
select(a, 1);
return 0;
}
四、通过指针引用字符串
4.1字符串的引用方式
#include <iostream>
using namespace std;
int main()
{
char *p = "adhashdasj";
char ch[] = "fjffdfsdsd";
p = "aaaaa";
printf("%s\n", p);
cout << *p << endl;
printf("%c\n", p[3]);
printf("%s\n", ch);
printf("%c\n", ch[3]);
static int a = 0;
int b = 0;
cout << (int)p << endl;
cout << (int)&a << endl;
cout << (int)ch << endl;
cout << (int)&b << endl;
}
4.2字符指针作为函数参数
用法同数组名作函数参数一样,这里不再介绍。
无非是类型由int变为char。
4.3字符指针变量和字符数组的比较
#include <iostream>
using namespace std;
int main()
{
char *p;
p = "China";
char ch[] = "China";
ch[2] = 'A';
printf("%s\n", p);
printf("%s\n", ch);
return 0;
}
五、指向函数的指针
5.1什么是函数的指针
函数名代表函数的起始地址。
函数名就是函数的指针,它代表函数的起始地址
5.2用函数指针变量调用函数
#include <iostream>
using namespace std;
int max(int x,int y)
{
if (x > y)
return x;
else
return y;
}
int main()
{
int a = 10;
int b = 20;
int c;
int(*p)(int, int);
p = max;
c = (*p)(a, b);
cout << "max:" << c << endl;
return 0;
}
5.3定义和使用指向函数的指针变量
#include <iostream>
using namespace std;
int Max(int x,int y)
{
if (x > y)
return x;
else
return y;
}
int Min(int x, int y)
{
if (x > y)
return y;
else
return x;
}
int main()
{
int a = 10;
int b = 20;
int min,max;
int(*p)(int, int);
p = Max;
max = (*p)(a, b);
p = Min;
min = (*p)(a, b);
cout << "max:" <<max << endl;
cout << "min:" << min<< endl;
return 0;
}
5.4指向函数的指针作为函数参数
#include <iostream>
using namespace std;
int fun(int x, int y, int(*p)(int, int))
{
return (*p)(x, y);
}
int Max(int x,int y)
{
if (x > y)
return x;
else
return y;
}
int Min(int x, int y)
{
if (x > y)
return y;
else
return x;
}
int main()
{
int a = 10;
int b = 20;
int max,min ;
max = fun(a, b, Max);
min = fun(a, b, Min);
cout << "max:" <<max << endl;
cout << "min:" << min<< endl;
return 0;
}
六、返回指针值的函数
#include <iostream>
using namespace std;
int *search(int (*p)[3],int n)
{
return *(p + n);
}
int main()
{
int a[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int *p;
for (int i = 0; i < 3; i++)
{
p = search(a, i);
for (int j = 0; j < 3; j++)
{
cout << *(p + j)<<"\t";
}
cout << endl;
}
return 0;
}
关于指针变量的类型及含义的总结:
变量定义 | 类型表示 | 含义 |
---|
int i | int | 定义整形变量i | int *p | int * | 定义p为指向整型数据的指针变量 | int a[5] | int [5] | 定义整形数组a,它由5个元素 | int *p[4] | int *[4] | 定义指针数组p,它由4个指向整形数据的指针元素组成 | int (*p)[4] | int (*)[4] | p为指向包含由四个元素组成的一维数组的指针变量 | int f() | int () | f为返回整形函数值的函数 | int *p() | int *() | p为返回一个指针的函数,该指针指向整形数据 | int (*p)() | int (*)() | p为指向函数的指针,该函数返回一个整形值 | int *p | int ** | p为一个指针变量,它指向一个指向整形数据的指针变量 | void *p | void * | p是一个指针变量 |
|