【指针专题】
前言
介绍指针的定义与使用,指针访问变量,数组,字符串,涉及多级指针,指针与const结合
一、指针的定义
- 指针是表示内存地址的一种低级数据类型,通俗讲,指针即地址。
- “ * ”运算符有多重含义,需要区分:可以用 “ * ” 来定义指针,可以用 “ * ” 做乘法运算 ,也可以是解引用 " * "。
- 定义指针的一般类型:
[存储类型] 数据类型 *指针1,*指针2,…;
二、指针的使用
1.指针指向变量并访问
- 定义一级指针指向变量,
- 定义二级指针指向一级指针(间接指向变量)
- 解引用的运用:通过一级指针和二级指针修改变量值
定义三级指针(多级指针)修改一级指针的指向
代码如下(示例):
//基本定义与使用
double a=1.0, b=2.2;
double* pa = &a, * pb = &b;
double** ppa= &pa, ** ppb = &pb;
**ppa = 9.9;
printf("a=%.1f\n", **ppa);
*ppb =&a ; //或者 pb=&a //通过ppb指向pb的指向a
printf("a=%.1f\n", **ppb);
double *** s=&ppa;
**s = &b; //通过s修改pa的指向 指向b
printf("b=%.1f\n", ***s);
2.指针与数组 字符串 结合
-
指针访问一维数组,先定义指向一维数组的指针
-
指针p指向数组arr的首地址,p+i就是数组元素arr[i]的地址,通过对这些地址施加 * 或[ ]运算则可以访问数组中元素中的数据
代码如下(示例):
int arr[] = { 1,2,3,4,5 };
int* p = arr; //int *p=&arr[0];
const char* pstr = "hello";
3.指针与函数参数的运用
- 函数形参使用指针,可将函数结果带出
如形参int* sum可将求和结果返回到主函数
代码如下(示例):
//实现一个函数Getsum() 返回值为void 实现1+2+3+4+....
//并将求和结果在main中打印出来
void GetSum(int n, int* sum)
{
//法一 *sum=(1 + n)* n / 2; //求和公式
//法二
*sum=0;
for(int i = 1; i <= n; i++)
{
*sum+= i;
}
/* 法三
int s=0;
for(int i=1;i<=n;i++)
{
s+=i;
}
*sum=s;
*/
}
- 函数形参使用指针,影响实参
如交换函数使用形参
代码如下(示例):
#inlcude<stdio.h>
void Swap1(int* a, int* b) //形参 栈内开辟空间
{
int temp = *a;
*a = *b;
*b = temp;
}
void Swap2(int a ,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int a=2,b=3;
Swap2(a , b);
printf("%d %d ",a,b); // 2 3
Swap1(&a, &b);
printf("%d %d ",a,b); // 3 2
}
4.多级指针
- 基本定义与使用
代码如下(示例):
#include<stdio.h>
int main()
{
//基本定义与使用
double a=1.0, b=2.2;
double* pa = &a, * pb = &b;
double** ppa= &pa, ** ppb = &pb;
**ppa = 9.9;
printf("a=%.1f\n", **ppa);
*ppb =&a ; //或者 pb=&a //通过ppb指向pb的指向a
printf("a=%.1f\n", **ppb);
double *** s=&ppa;
**s = &b; //通过s修改pa的指向 指向b
printf("b=%.1f\n", ***s);
}
5.指针自加与自减
- 指针加一 偏移量 访问元素
代码如下(示例):
*/
#include<stdio.h>
#include<string.h>
void Show(int* p, int n)
{
//法一
printf("指针指向首元素不动,利用偏移量输出:");
for (int i = 0; i < n; i++)
{
printf("%d ", *(p + i));
}
//法二
printf("\n使用指针加一,利用指针指向每一个元素输出:");
for (int i = 0; i < n; i++)
{
/*printf("%d ", *p);
p++;*/
printf("%d ",*p++);
}
printf("\n\n");
}
int main() //栈区 函数局部变量
{
int ar[] = { 1,2,3,4,5 };
//int* p = arr; //int *p=&arr[0];
int n = sizeof(ar) / sizeof(ar[0]);
Show(ar, n);
}
6.指针与const结合的运用
- const 与一级指针结合
const int* p=&val;
const 限定*p; 不能通过p修改所指之物的值
int* const p=&val;
const 限定p; 不能修改p的指向,可以通过p修改所指之物的值
代码如下(示例):
#include<stdio.h>
#include<string.h>
size_t mystrlen(const char* p)
{
size_t count = 0;
while (*p!='\0')
{
count++;
p++;
}
return count;
}
int main() //栈区 函数局部变量
{
const char* pstr = "hello";
size_t i = mystrlen(pstr);
printf("长度:lenght_*pstr=%d\n\n",i );
}