- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章简单总结C语言中各种类型的指针的概念由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
C语言中有很多关于指针的使用,指针也是C语言的灵魂所在,而且C语言中也有很多有关指针的概念,这里学习并总结了一些知道的概念。 常量指针: 首先它是一个指针,常量只是用来修饰指针的定语。其定义如下:
1
2
|
char
const
* cp;
char
a=
'a'
;
|
如何识别呢?根据右结合优先,先是*优先,所以这个cp变量是一个指针,然后是const修饰*,所以这是一个常量指针。即指向常量的指针.
1
2
|
cp=&a;
//正常语法
*cp=a;
//错误语法,因为其指向的值是一个常量
|
指针常量: 首先它是一个常量,指针是用来修饰常量的,即常量的值为一个指针地址.
1
2
|
char
*
const
cp;
char
a=
'a'
;
|
如何识别呢?根据右结合优先,先是const优先,所以这个cp变量是一个常量,然后是*修饰const,所以这是一个指针常量.
1
2
|
cp=&a;
//错误语法,因为其地址为是一个常量
*cp=a;
//正确,地址所指向的内容是一个普通字符
|
指针数组: 首先它是一个数组,指针是用来修饰数组内容的,表示什么样的数组 :即存放指针的数组 。
1
|
char
*arr[3] = {
"1"
,
"123"
,
"345"
};
|
如何识别,因为[]的优先级大于*,所以先是定义为一个数组,而后由*来修饰这个数 。
1
2
|
printf
(
"arr0%c\n"
,*arr[0]);
printf
(
"arr1%s\n"
,arr[1]);
|
数组指针: 首先它是一个指针,数组是修饰指针的,即指向数组的指针.
1
2
3
|
char
(*p)[3];
//申明时不能同时初始化
char
arr[3] = {
'1'
,
'4'
,
'7'
};
p=&arr;
//指向数组的首地址,同时指针的类型是char * [3] 类型的,即加1操作后为sizeof(char [3])三个字节数
|
如何识别:因为这次添加了一个显示优先,所以这次先是一个指针,而后[]修饰指针 。
1
2
3
4
5
6
7
8
9
|
printf
(
"%c\n"
,(*p)[0]);
//先取arr的首地址,再根据这个地址取数组内容
printf
(
"%c\n"
,(*p)[1]);
printf
(
"%c\n"
,(*p)[2]);
printf
(
"%c\n"
,*((
char
*)p+0));
//先转换为char指针,再取值
printf
(
"%c\n"
,*((
char
*)p+1));
printf
(
"%c\n"
,*((
char
*)p+2));
printf
(
"%c\n"
,((
char
*)p)[0]);
//先转换为char指针,再取数组的值,和第一个类似
printf
(
"%c\n"
,((
char
*)p)[1]);
printf
(
"%c\n"
,((
char
*)p)[2]);
|
函数指针: 首先它是一个指针,函数是修饰指针的,即指向函数的指针.
1
2
3
4
5
6
7
8
9
10
|
char
(*func)(
void
);
//定义函数指针
char
test(
void
)
{
return
'A'
;
}
func = test;
//初始化赋值
printf
(
"test address: %p\n"
,test);
printf
(
"func address: %p\n"
,func);
char
ch = func();
//调用
printf
(
"%c\n"
, ch);
|
如何识别,同数组指针一样,因()的优先级,所以这个定义首先是一个指针,而后才是对指针的描述,即一个指向函数的指针,其指向的函数也是规定的:即返回的是字符类型,不需要传入参数 指针函数: 首先它是一个函数,指针修饰函数的返回类型,即一个返回指针的函数 。
1
|
char
*func(
void
);
|
如何识别,因为没有扩弧,所以*的优先级没有右边的扩弧优先级高,所以先是规定了一个函数,*只是修饰返回值的 。
1
2
3
4
5
6
7
8
|
char
*func(
void
) {
char
*str =
"test"
;
return
str;
}
void
main() {
char
*test = func();
printf
(
"%s\n"
,test);
}
|
结构体指针: 当然其原先也是一个指针,只不过就是指向了结构体而已。故而为结构体指针.
指针结构体: 指针结构体,其实也没有必要有这个概念,无非就是带有指针作为子项的结构体.
指针类型转换: 指针类型转换是个有意思的东西,你可以把一个int型的指针转换为char类型,然后再把char类型的指针转换为int型;就像普通的字符和int型之间的转换一样。但指针转换后其值没有变,唯一变的东西就是指针的步长,即进行指针运算时的计算方式。当为char指针时其运算单位均以1个字节为1个运算单位,而当为int指针时通常都是以4个字节为1个运算单位。 指针算术: 根据上面的指针类型转换介绍可知,不同的指针类型进行算术运算时其计算方式时不相同的,其不同之处就在于其步长的字节数不同,而具体其步长为几个字节数是以其指针类型决定的,指向char的指针步长即为1。通常的指针运算有指针与数字的加减运算,相同类型的指针的减法运算,而且还要是指向同一个数组的,不然意义不大。同理推得不同类型的指针进行运算意义更不大,甚至会报错。 下面举一个指针算术的例子,交换两个变量值不利用额外变量 毕竟new关键字还是申请了额外的内存,虽然没有申请变量,换汤未换药 。
1
2
3
4
5
6
|
int
*a,*b;
a=
new
int
(10);
//给指针赋值
b=
new
int
(20);
//a=0x00030828,b=0x00030840
a=(
int
*)(b-a);
//a=0x00000006
b=(
int
*)(b-
int
(a));
//b=0x00030828
a=(
int
*)(b+
int
(a));
//a=0x00030840
|
只是交换变量的话也可以:
1
2
3
4
5
6
7
|
int
a = 4;
int
b = 5;
*(((
char
*)&a)+1) = *((
char
*)&b);
*((
char
*)&b)=*((
char
*)&a);
*((
char
*)&a)=*(((
char
*)&a)+1);
*(((
char
*)&a)+1)=0;
|
指针参数: 指针参数就是指,指针作为函数的参数进行传递,因为C语言只支持单向传值,且返回值只能是一个值类型,所以想要从函数内返回多个内容或者与函数体有一个共同的数据操作区域,那这个时候就可以考虑通过传指针参数的方式了。传指针也是传值,只不过这时的值为指针指向的地址,也就是一个int整数。通过传递一个地址后就可以对一个共同的区域进行操作和数据共享了。 指针指针: 指针的指针就是指向指针的指针,同理还有指向指针指针的指针;不过一般人的思维能做二级、三级的指针的就很好了。这里主要是扩展一下指针与多维数组的关联关系。从个别到一般来分解多维数组的处理。这里个别肯定是用二维数组来举个例子,那就可以延伸到多维数组.
最后此篇关于简单总结C语言中各种类型的指针的概念的文章就讲到这里了,如果你想了解更多关于简单总结C语言中各种类型的指针的概念的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!