指针在函数中的使用
一,普通函数的调用
//普通函数的调用
#include<stdio.h>
int add(int a,b)
{
return a+b;
}
int main()
{
add(1,2)
int a = 3,b =4;
add(a,b);
return 0;
}
二,函数的形式参数为指针类型
定义形式:返回类型 函数名(指向类型 * 指针名)
//函数的形式参数为指针类型
#include<stdio.h>
void func(int *p)
{
printf("%d\n",*p);
}
int main()
{
int a = 3,b =4;
func(&a);
int *z = &b;
func(z);
//return 0;
}
三, 指针在函数数组中的使⽤
//数组
#include<stdio.h>
void func(int *p)
{
for(int i=0;i<10;i++)
{
printf("%d ",p[i]); //打印整个数组
}
printf("\n");
*p=10; //代表着下标地址为0的(也就是首地址)的值为10;
*(p+1)=20; //代表着下标地址为1的值为20
p[2]=30; //代表着下标地址为2的值为30
}
int main()
{
int buf[10]={1,2,3,4,5,6,7,8,9};
func(buf);
for(int i=0;i<10;i++)
{
printf("%d ",buf[i]); //打印更改后的数组。
}
printf("\n");
return 0;
}
四, 指针在函数字符数组中的使⽤
1,格式
//字符数组
#include<stdio.h>
void func(char *p) //指针存储的是字符数组的地址。
{
}
int main()
{
char buf[20]="hello world"; //定义一个字符数组
func(buf);
printf("%s ",buf);
return 0;
}
2,更改其中某个字符。
//字符数组中某个相同字符的修改
#include<stdio.h>
void func(char *p) //指针存储的是字符数组的地址。
{
int i=0;
while(*(p+i) != '\0')
{
if(*(p+i)=='l')
{
*(p+i)='o';
}
i++;
}
/*
while(*p != '\0');
{
if(*p=='l')
{
*p='o';
}
p++;
}
*/
}
int main()
{
char buf[20]="hello world"; //定义一个字符数组
func(buf);
printf("%s ",buf);
return 0;
}
//如果只更改某一个字符利用之前所学的内容在执行完更改后添加break 函数即可跳出这个循环。
五, 指针在函数二维数组中的使⽤
#include<stdio.h>
void func(int (*p)[3] )
{
*p; //代表着数组元素的首地址buf[1]
*(p+1); //代表着将数组后移一个位置即buf[1]
* p+1; //代表着二维数组的第一个元素即buf[0][1]
for(int j=0;j<2;j++) //遍历一维数组
{
for(int i=0;i<3;i++) //遍历二维数组
{
printf("%d ",*(*(p+j)+i)); //打印整个二维数组
}
printf("\n");
}
}
int main()
{
int buf[2][3]={{1,2},{4,5,6}};
func(buf);
}
六,函数指针
函数指针: ⽤于存储函数地址类型的指针变量
函数指针的定义: 返回类型 函数名(指向类型 * 指针名)
七,空指针、野指针、万能指针
1,野指针:
指针存储的地址不明确(指向的空间不清楚--没有分配不能使⽤),这个地 址对应的空间是否能够在程序中具有操作不清楚。
2,控制着
指针记录的地址是0x0这个地址就叫做空指针,系统规定0x0这个地址不 允许任何程序进⾏访问。
3,万能指针
不管是哪种类型的指针,都是⽤来存储地址,内存地址⽤多少位来表⽰地址 早就规定好了,每个地址都是相同的位数
32位机器⽤4B来表⽰地址
64位机器⽤8B来表⽰地址
void:空类型,不存在这个对应的类型⼤⼩ 空指针类型,指针类型,⼤⼩就是4B/8B,存储地址 void 叫做万能指针(指向任意类型),可以存储任意类型的地址(指针值), 但是不能取 * 取对应地址中的值 由于是万能指针,可以存储任意类型的地址,也可以把指针值赋值给其他任 意类型的指针变量。
八,关键字
auto:在局部变量中使⽤,表⽰⾃动存储管理(⾃动分配,⾃动释 放),表⽰在栈区存储局部变量,如果局部变量不加其他的存储类型, 默认添加auto
定义:(auto) 数据类型 变量名;
static:静态数据类型,表⽰把数据存储在数据段中的静态区(也叫全 局区)
static 修饰的是局部变量:就表⽰局部变量不是默认的auto存储(不是 栈存储),变量的⽣命周期不再是语句块结束⽽结束,⽽是整个程序结 束才结束,作⽤于不变还是之前的区域,如果遇到多次创建同⼀个静态 变量,不会重复定义初始化,使⽤之前创建的静态变量
static 修饰的是全局变量:全局变量只能在本⽂件中使⽤
static 修饰 函数:函数只能在本⽂件内使⽤
定义:static 数据类型 变量名;
register:寄存器存储,把数据存储到cpu内部的存储单元中,在执⾏ 程序时,如果能够存储到cpu中就存储进⾏,在执⾏程序时,cpu的资源 已经被占⽤完,当作普通auto类型存储
定义:register 数据类型 变量名;
extern:⽤于提供⼀个全局变量的引⽤,在其他⽂件中定义了⼀个变 量,现在使⽤其他⽂件定义的变量,会把变量名指向⼀个之前定义过的 存储位置 extern 数据类型 变量名;
注意:如果全局变量或静态变量没有进⾏初始化(由于存储在数据段),⾃ 动把没有进⾏初始化的变量初始化为0。auto局部变量没有进⾏初始 化,则是之前的随机值,不会进⾏初始化
常量关键字:const const修饰变量,则表⽰变量不可修改,只能访问(只能获取值,不能修 改值) ⼀般只要使⽤const修饰都会完成初始化(定义时赋值)
注意: