找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1363|回复: 15
收起左侧

关于C语言各种指针的定义

[复制链接]
ID:879924 发表于 2022-2-16 22:48 来自手机 | 显示全部楼层 |阅读模式
指向一个整形变量的指针:
指向一维整形数组的指针:
指向二维整形数组的指针:
指向一个字符变量的指针:
指向一维字符数组的指针:
指向二维字符数组的指针:
分别如何定义呢?
回复

使用道具 举报

ID:824490 发表于 2022-2-17 10:53 | 显示全部楼层
这个问题有点绕,期待有高手来说说。
个人觉得,指针只是指针,而不管指向单元是存放什么类型的数值,好比一排文件柜,指针只是打开第3排第2个抽屉,至于抽屉里放的一本书还是一堆零食,指针就管不了了。。
回复

使用道具 举报

ID:879809 发表于 2022-2-17 11:45 | 显示全部楼层
名字不是重点 发表于 2022-2-17 10:53
这个问题有点绕,期待有高手来说说。
个人觉得,指针只是指针,而不管指向单元是存放什么类型的数值,好比 ...

错,指针操作必须考虑类型,比如指针++或者指针+1,如果是4字节int型,那么会+4,如果是char会+1
回复

使用道具 举报

ID:161164 发表于 2022-2-17 11:54 | 显示全部楼层
指针类型还是有必要的
如文件柜第3排第2个抽屉是放了一本短篇小说(char)
或是8051入门到精通上册(int)
或是C语言入门到放弃1/4(Long)

如果你宣告的指针类型是int
但指向的地址是Long
你就只能拿到C语言入门到放弃1/4 和2/4
引致数据不完整
回复

使用道具 举报

ID:624769 发表于 2022-2-17 12:27 | 显示全部楼层
从根源上来讲,
指针类型,代表这个指针的指向目的地,是指向内部存储器(char* data),外部存储器(char* xdata),还是代码区(char* code),
而 char  int   long  这些属于 变量类型,和指针本身没有直接关系。
回复

使用道具 举报

ID:824490 发表于 2022-2-17 13:29 | 显示全部楼层
本帖最后由 名字不是重点 于 2022-2-17 13:50 编辑
rundstedt 发表于 2022-2-17 11:45
错,指针操作必须考虑类型,比如指针++或者指针+1,如果是4字节int型,那么会+4,如果是char会+1

探讨一下:
指针是特有的类型,不属于"char"/"int"/"long"等类型之列:
比如:
unsigned char num[]="0123456789"   
当*num时,指向的是num数组的首地址num[0]="0",*num++,指向的是num[1]="1";
而再如:
unsigned int num[]="这是一个双字节整型数组"   
当*num时,指向的是num数组的首地址num[0]="这",*num++,指向的是num[1]="是";
这种情况下,如果因为chinese[]是int类型,读num[1],就是*num+2,似乎说不通。


欢迎指正!


回复

使用道具 举报

ID:824490 发表于 2022-2-17 13:37 | 显示全部楼层
lkc8210 发表于 2022-2-17 11:54
指针类型还是有必要的
如文件柜第3排第2个抽屉是放了一本短篇小说(char)
或是8051入门到精通上册(int)

好比当你往抽屉放东西时,就已经决定了这个抽屉的用途。当你在定义数组时,就要先定义这个数组的类型。
指针说白了,只是打开这个抽屉的钥匙。钥匙本身材质和抽屉的内容物真没关系,铜或铝均可,只要钥匙的齿能对上抽屉锁的坑。而抽屉的内容物和抽屉体积大小才有关,“抽屉体积大小”这个才是数组的类型。
回复

使用道具 举报

ID:824490 发表于 2022-2-17 13:38 | 显示全部楼层
188610329 发表于 2022-2-17 12:27
从根源上来讲,
指针类型,代表这个指针的指向目的地,是指向内部存储器(char* data),外部存储器(char* x ...

赞同这个说法。
回复

使用道具 举报

ID:879809 发表于 2022-2-17 15:38 | 显示全部楼层

你们只学过C51才会说出这种无知的说法。
回复

使用道具 举报

ID:429003 发表于 2022-2-17 15:42 | 显示全部楼层
沙发说的没错,指针就是指针,某一个地址的存储变量而已! 指向的内容可根据实际应用类型而定。当然,如果应用明确,也可以定义时直接声明指针类型。

无论是变量、指针、数组还是函数指针等,无外乎是CPU寻址范围内某一个位置的序号及对应序号位置存储数据内容的关系而已。
回复

使用道具 举报

ID:824490 发表于 2022-2-17 15:44 | 显示全部楼层
rundstedt 发表于 2022-2-17 15:38
你们只学过C51才会说出这种无知的说法。

举个例子?
回复

使用道具 举报

ID:624769 发表于 2022-2-17 17:18 | 显示全部楼层
rundstedt 发表于 2022-2-17 15:38
你们只学过C51才会说出这种无知的说法。

不知道你是基于什么底气说出“无知”两字?

站在 C++ 立场来讲, 指针是没有类型的。

站在 C51 立场,指针才有了类型,严格来讲只有两种类型,
一种叫 通用指针
一种叫 专用指针
专用指针 再分  片内指针和片外指针。

但是,无论哪个立场,都不会出现你回复中所出现的 char int  这种分类,这种分类只是针对变量的类型,指针不是变量!!!
回复

使用道具 举报

ID:313048 发表于 2022-2-17 18:07 | 显示全部楼层
rundstedt 发表于 2022-2-17 15:38
你们只学过C51才会说出这种无知的说法。

无知?不知道你为啥会说出这样的话,别人只是从他理解的角度说明这个问题,在你眼里怎么就变成无知了?还有你怎么就知道别人只学过51?还是说因为你多学了一个TI的430?还是说意法半导体的32?还是说其他飞思卡尔的K60?亦或者是跑Linux系统的H5?哪里来的优越感?张口就说别人无知。
回复

使用道具 举报

ID:313048 发表于 2022-2-17 18:10 | 显示全部楼层
只要是C,就离不开其指针的独特性,整个C都是围绕着指针在做应用,指针无非是一个指向地址的常量,所有关于指针的操作都是在这个地址上做的操作。
回复

使用道具 举报

ID:972839 发表于 2022-2-18 14:12 | 显示全部楼层
指针就是指针啊,提供了一直连续的,可以跳跃式的指向方式,
回复

使用道具 举报

ID:844772 发表于 2022-2-18 14:33 | 显示全部楼层
其实地板说的很清楚了,单独看sizeof(指针),不同指针本身大小都一样(由计算机的位数决定),但不同类型的指针自己做加减运算时,地址改变量就不同了,C51很少有复杂数据结构,这个差异就很难觉察。我写个小程序,可以看到不同类型指针,在做加运算和减运算时,地址的增加量是不同的。注意要自己算一下改变量。
#include <stdio.h>
int main(){
    int    a = 123,   *pa = &a;
    double b = 456, *pb = &b;
    char   c = 'a',  *pc = &c;
   
    printf("&a=%#X, &b=%#X, &c=%#X\n", &a, &b, &c);
    printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc);
    //加运算
    pa++; pb++; pc++;
    printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc);
    //减运算
    pa -= 2; pb -= 2; pc -= 2;
    printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc);
   
    return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表