c语言指针详解_C语言/C++指针知识点总结详解

本文详细介绍了C语言中指针的基本概念,包括定义、赋值、作为函数参数的应用等,并探讨了指针与数组、字符串的关系及const指针的用法。

1、什么是指针

如果把某一块已经开辟的内存空间比作房间,那么指针就是一把钥匙。房间有大有小,而钥匙就那么大,所以指针所占用的字节为4字节。这把钥匙可以根据你的设定来让它开哪个房间,但是,最多只能开一个房间。

2、指针定义和赋值

(1)定义

我们平常见到的定义指针有两种写法:int *p和int* p,其实这两种写法效果是一样的,但是为了避免混淆,建议采用第一种int *p,因为如果你同时定义了一个指针变量和一个普通变量,如:int* p,a;你可能以为定义了两个指针p和a,所以采用第一种能避免混淆。

(2)赋值

赋值方式有两种

定义时赋初值:int a; int *p=&a

先定义,后赋初值:int a; int *p; p=&a

注意:哪怕你知道变量a的地址是1100,你也不能将1100直接赋给p,一定要用取地址的方式。

(3)数组首地址赋给指针

我们都知道,数组名就是数组的首地址,所以将指针指向数组时直接把数组名赋给指针变量即可:int a[10]; int *p; p=a;

3、引用指针变量

&作为取地址符,*是取值符,如果指针指向的是单个变量,直接用 *将p指向地址的值取出即可:

cout<

如果指针指向的是一个数组,那么 *p 取得是第一个值,因为前面说过将数组首地址是赋给p的,但如果要表示a[1],a[2],可以用 *(p+1), *(p+2)来表示,p++代表的是将指针的指向移动一个位置, 不是移动一个字节,移动的字节数取决于指针指向的类型,如果指针指向的是int类型的数组,那么每次p++就移动4个字节,如果指向char类型的数组,每次p++就移动1个字节。

也可以直接用cout<

所以指向数组名的指针可以当做数组名来使用。

4、指针作函数参数

一般调用函数传参都是值传递,如果函数参数时指针的话,那么调用函数时就得将相应地址传过去,所以函数执行过程中进行的一系列操作也是对地址进行的操作,也就改变了实参的值。常见的地址传递有:

(1)传递数组名进行排序mySort(arr,len)

(2)排序过程中两个数交换swap(&arr[i],&arr[j])

5、字符串与指针

在C语言中,一个字符串常量不可以直接赋给一个数组,比如:char s[10]; s="hello";这种写法是错误的。但是一个字符串却可以直接赋给一个指针:char *p; p="hello";这仅限于将一个字符串常量的地址赋给指针p,但如果char s[10]; char *p=s; *p="hello";这就是非法的,这就相当于直接把字符串常量赋给一个数组,其实字符串常量赋给一个数组可以采用strcpy()函数。

6、函数与指针

函数的返回值也可以是指针类型,前提是这个指针指向的内存在函数调用后不会被销毁,在这里不做过多说明。

7、指向指针的指针

例如:

int a=10;int *p=&a;//取a的地址传给pint *(*pp)=&p;//取p的地址传给pp//如何引用:cout<

8、const指针相关【难点】

const修饰常变量,如何理解?例如:const int a=10;这就定义了一个常变量a,a的值不可修改。

再论指针,指针有两个东西可变:

int a=10; int *p=&a;

(1)指针指向的地址里面存放的值可变*p=5; //a的值变为5;

(2)指向的指向可变int b=10; p=&b; //p的指向被改为a;

因此,const在不同地方修饰就有不同的效果

如:

(1)int a=10; const int *p = &a;

此时const修饰int,代表*p的值不可改变,也就是p指向的值不可以改变,但p的指向可以改;

(2)int a=10; int const *p = &a;

此时const修饰p,代表p的指向不可改变,但p的值可以改变。

(3)int a=10; const int* const p=&a;

由此类推此时p的指向和p指向的值都不可改变

9、void类型指针

void代表空,大家就很疑惑为什么指针还有空类型,有人可能以为void类型指针可以指向任何类型的数据,这种理解是错误的。应该理解为 “指向空类型”或“不指向确定类型”的数据,那么如何指向空类型呢?举个例子:

int a=3;int *p1=&a;void *p2=(void *)p1;//这一句就是将一个指向int类型的指针转化为空类型指针然后赋给p2;cout<

10、有关指针数据类型的小结

c79d199d4c76efb9797e5fd7f87b710b.png

指针数据类型大全

大家如果将这些全部弄清楚指针这块就差不多可以了 ^_^

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值