c语言·指针{详细版}(谭浩强版【大一秋季学期】)

这篇博客详细介绍了C语言中的指针概念及其使用,包括指针的初始化、地址与值的转换、指针作为函数参数、通过指针引用数组、多维数组及字符串,以及指向函数的指针。文中还探讨了动态内存分配和释放,以及指针数组和多重指针的应用。内容涵盖了指针在程序设计中的灵活性和重要性。
摘要由CSDN通过智能技术生成

以下以看书时联想到的顺序写:

&指升一级,*指降一级

(例)int a=100;

int *p;

           p=&a;(因为&升一级,变成指向a的地址)

(初始化)int *pointer_1=&a;

初始化时指针要带上'*'

printf("%o",p);

作用是以八进制数的形式输出指针变量p的值如果p指向了a,就是输出a的地址,即&a。

指针变量作为函数参数:

(例)void swap(int *p1,int *p2)

{

int temp;

temp=*p1;

*p1=*p2;(对p1,p2所指向的地址赋值是有意义的,而对p1,p2赋值是无意义的)

*p2=temp;

}(在函数调用完后,形参*p1,*p2就被释放了。)

(反例)

void swap(int *p1,int *p2)

{

int *temp;

temp=*p1;

*p1=*p2;

*p2=*temp;

}

未给*temp赋值,因此temp中并无确定的值(它的值是不可预见的),所以temp所指向的单元也是不可预见的,所以对*temp赋值就是向一个未知的存储单元赋值,而这个未知的存储单元中可能存储着一个有用的数据,这样就有可能破坏系统的正常工作状况
所以,要想通过子函数将主函数中的变量赋值,可以采用指针形参

通过指针引用数组

int a[2]={0,1};
int *p;
p=&a[0];\\把a[0]元素的地址赋给指针变量p
p=a;\\把a数组的地址赋给指针变量p

对指针进行加减

p+(-)1——p指向下(上)一个元素(加上一个数组元素所占用的字节数)

两个地址不能相加(可以相减)

下标法:a[2]={1,2};

指针法:*(p+i)等价于*(a+i)等价于a[i]等价于p[i]("[]"在编译时被当作'+')

a为指针常量,不可自加自减或是被赋值

++(*p)指先取p所指向的值然后自加

void fun(int arr[],int n)\\arr[]中的[]内不用写入具体的值,因为传过去的是指针。而且传过去的是指针说明在子函数内对数组内的值进行修改,会使原数组的值被修改。

指针引用多维数组

int a[2][4]

a[0]+1等价于a[0][1](a[0]相当于数组名)

int (*p)[4];(初始化二维数组)

此时,a[1]第2行第0列元素的地址,&a[1](等价于a+1)第2行起始地址

赋值p=a,p=&a[0]

*(p+1)~~a[1],*(*(p+1)+1)~~a[1][1]

指针引用字符串

初始化:char *string="I love U";(字符串结尾是'\0')(指向字符串首字符)

string不是一个字符串变量,在c语言中只有字符变量,没有字符串变量

初始化亦作:char *string;

string="I love U";(string不用再使用'*',因为是把字符串的首字符地址传入)

string++即指向'I'下一个字符

string在定义时要初始化,因为定义指针时,指针并不是无指向的,指针会指向未知的存储单元,如果此时对指针进行其他操作可能会破坏系统、

(例)

char *a="I love U";
a=a+7;
printf("%s",a);

输出结果:U

引用数组具体元素地址法与之前的相似,不赘述

(例)

char *format;
format="a=%d,b=%f\n";
printf(format,a,b);

等价于:printf("a=%d,b=%f\n",a,b)(这种printf称作可变格式输出函数

指向函数的指针

int (*p)(int,int);

(例)

int max(int,int);

int (*p)(int,int);

p=max;

c=(*p)(a,b);

对于p++,p+1等运算没有意义

(其实光从上面这些用法好像并不太能知道在什么地方可以用)实用:

if(n==1) p=max;
if(n==2) p=min;

这样便可以灵活地调用函数(菜单那种形式的程序,虽然可以用if或switch语句来判断,但是用指针变量显得更专业并能让程序变得更简洁)

用指向函数的指针作函数参数

void fun(int (*x1)(int),int (*x2)(int,int))

{

int a,b,i=3;

a=(*x1)(i);

b=(*x2)(i,j);

}

返回指针值的函数

int *a(int x,int y);(a两侧没有括号)

return返回值不带'*'

例 return (b)(b为指针)

指针数组和多重指针

int *p[4](有点像指向1维数组的指针,但是在p两测无括号)

用途:指针数组比较适合用来指向若干个字符串,使字符串处理更加灵活(2维字符串数组必须要知道列数(行数不用))

指向指针数据的指针变量

char **p;

char *name[4];

p=name+2;

指针数组作main函数的形参

int main(int argc(参数个数),char *argv[](字符指针数组))(main函数的参数必须是这样的)

动态内存分配于指向它的指针变量

非静态的局部变量(包括形参)是分配在内存中的动态存储区的,这个存储区是一个称为栈

c语言允许建立内存动态分配区域,需要时随时开辟,不需要时随时释放。这些数据临时存放在一个特别的自由存储区——堆

void *malloc(unsigned int size)开辟动态存储区,当开辟失败时返回NULL

void *calloc(unsigned n,unsigned size)分配n个长度为size的连续空间——p=calloc(50,4)

void *realloc(void *p,unsigned int size)如果已经通过malloc或calloc函数获得了动态存储空间,想改变其大小,可以用realloc重新分配——realloc(p,50)

free释放动态存储空间void free(void *p)

记住及时释放掉多开辟的无用的空间

以上4个函数需声明include<stdlib.h>

在平常写程序时往往是以这种形式出现:p=(int*)malloc(100)(前面的(int*)为类型强制转换)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值