- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!