鱼C论坛

 找回密码
 立即注册
查看: 2680|回复: 7

[已解决]关于指针变量的问题

[复制链接]
发表于 2023-2-3 23:05:40 | 显示全部楼层 |阅读模式
5鱼币
我只知道指针变量一开始是来保存地址的比如

int a = 123;
int *p;
p = &a;

p保存的就是a的地址,而p也有属于自己的地址

但是如果我直接*p = 123; 或*p[3] = {1,2,3};他是不是就相当于一个普通的变量了?

还有普通变量和指针变量有什么区别
最佳答案
2023-2-3 23:05:41
本帖最后由 两手空空儿 于 2023-2-4 10:13 编辑

普通变量和指针变量没有什么区别,都是普通变量,只是指针是带*的类型
int a = 123;    普通变量a, 类型int
int *p;   普通变量p, 类型int*
p = &a;   给变量赋值   和 a = 321没什么区别

*p = 123;  这是让指针p当中介,来操作变量a, 本质是 a = 123
int *p[3] = {1,2,3};   这是一个指针数组, 它是数组,有3个元素, 每个元素是一个【int*类型】的指针, 3个元素的值分别是 1, 2, 3

最佳答案

查看完整内容

普通变量和指针变量没有什么区别,都是普通变量,只是指针是带*的类型 int a = 123; 普通变量a, 类型int int *p; 普通变量p, 类型int* p = &a; 给变量赋值 和 a = 321没什么区别 *p = 123; 这是让指针p当中介,来操作变量a, 本质是 a = 123 int *p[3] = {1,2,3}; 这是一个指针数组, 它是数组,有3个元素, 每个元素是一个【int*类型】的指针, 3个元素的值分别是 1, 2, 3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-3 23:05:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 两手空空儿 于 2023-2-4 10:13 编辑

普通变量和指针变量没有什么区别,都是普通变量,只是指针是带*的类型
int a = 123;    普通变量a, 类型int
int *p;   普通变量p, 类型int*
p = &a;   给变量赋值   和 a = 321没什么区别

*p = 123;  这是让指针p当中介,来操作变量a, 本质是 a = 123
int *p[3] = {1,2,3};   这是一个指针数组, 它是数组,有3个元素, 每个元素是一个【int*类型】的指针, 3个元素的值分别是 1, 2, 3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-4 23:29:17 | 显示全部楼层
两手空空儿 发表于 2023-2-4 10:05
普通变量和指针变量没有什么区别,都是普通变量,只是指针是带*的类型
int a = 123;    普通变量a, 类型in ...

我还想问一个问题字符数组为什么可以存放中文字符

char *p[5] = {
        '卧槽这是为什么'',
        "而且我打印p的尺寸是8为什么是8了难道他保存的是地址?",
        "而打印*p的尺寸是1",
        "可不可以说一下字符数组保存中文在内存中是怎么样的",
        "其实我有点不好意思问的但是想了半天也没想出来所以还是问了"
};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-5 09:51:36 | 显示全部楼层
摸你穷 发表于 2023-2-4 23:29
我还想问一个问题字符数组为什么可以存放中文字符

char *p[5] = {

也是数字
sh-5.1$ cat main.c
#include <stdio.h>

int main(void) {
    char str[] = "你好,世界!\n";
    puts(str);
    for(size_t i = 0; i < sizeof(str); ++i) {
        printf("%.2hhx ", str[i]);
    }
    puts("");
    return 0;
}
sh-5.1$ ./main
你好,世界!

e4 bd a0 e5 a5 bd ef bc 8c e4 b8 96 e7 95 8c ef bc 81 0a 00
sh-5.1$
sh-5.1$ cat main.c
#include <stdio.h>

int main(void) {
    // 你
    putchar(0xe4);
    putchar(0xbd);
    putchar(0xa0);
    putchar('\n');
    return 0;
}
sh-5.1$ ./main
你
sh-5.1$
sh-5.1$ cat main.c
#include <stdio.h>

int main(void) {
    // 好
    putchar(0xe5);
    putchar(0xa5);
    putchar(0xbd);
    putchar('\n');
    return 0;
}
sh-5.1$ ./main
好
sh-5.1$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-5 16:48:15 | 显示全部楼层
本帖最后由 jackz007 于 2023-2-5 16:59 编辑
int a = 123 ;
int * p     ;
p = & a     ; // p 指向变量 a,那么,* p 就是 a
* p = 321   ; // 改变 a 的值为 321,此句就是 a = 321 
        至于
* p[3] = {1,2,3}
        这种形式只允许出现在变量的定义中,因为这是在指示编译器预留和初始化变量存储空间,运行时是绝对不允许这样(用数组给变量赋值)赋值的。
        至于可以用字符数组保存汉字的问题,没有什么好奇怪的,我们知道,字符数组可以用来保存字符串,无论是英文字符还是中文字符,被保存的都是字符的编码,对于西文字符,每个字符对应一个 ASCII 编码,这个编码占用一个 char,对于中文字符,操作系统缺省采用 'GBK' 编码,每个汉字占用 2 个 char。当按照字符打印这些编码的时候,操作系统会自动把这些数字(字符编码)兑换成对应的中、西文字符,并进行显示输出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-6 13:09:56 | 显示全部楼层
摸你穷 发表于 2023-2-4 23:29
我还想问一个问题字符数组为什么可以存放中文字符

char *p[5] = {

1、电脑里可以存放的只有 0 1 ,也就是说只能存储数字,没有文字,要想让来表示人能看懂的字符,前人做了一个规定,制定了一张ASCII码表, 里面人为定义 33H 表示字符 ‘3’,41H表示字符 ‘A’ ,一个字节可以有256个数值,就能表示256种字符,英文字符根本就没有那么多,只用了128个值,就是我们看到的ASCII表的值,从0到127,这样就可以用一串16进制数(char字符串)表示一个英文句子;我们的汉字256个值明显是不够用的,那就用两个16进制数来表示一个汉字,两个字节可以表示65536个值,这下就够用了,我们照样可以用一串16进制数来表示汉语句子(同样是char字符串),两个字节翻译成一个汉字。65536个值不但能放下所有汉字,还空很多,然后又把日文,韩文,英文等等的全都放了进去,就有了UNICODE字符集
2、char *p[5]  , 这个一个数组,存放的是指针,打印p的尺寸其实打印的是p[0]的尺寸,你是64位系统,所以是8; *p 其实就是*p[0], p[0]是一个char*,它指向的就是一个char, *p的尺寸就是1(一个char)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-18 23:55:53 | 显示全部楼层
两手空空儿 发表于 2023-2-6 13:09
1、电脑里可以存放的只有 0 1 ,也就是说只能存储数字,没有文字,要想让来表示人能看懂的字符,前人做了 ...

老兄有些小问题想问你,我个人对指针数组和数组指针的理解问题

指针数组:跟普通数组差不多这是可以保存地址,就是数组里面保存指针

数组指针:我还不是很理解,但大概是指针保存数组

想请你看看我理解的对不对麻烦在科普科普
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-19 12:18:35 | 显示全部楼层
摸你穷 发表于 2023-2-18 23:55
老兄有些小问题想问你,我个人对指针数组和数组指针的理解问题

指针数组:跟普通数组差不多这是可以保 ...

数组指针,首先它是一个指针,它指向一个数组,虽然它的值和数组的起始地址相同,但是指向的是整个数组,
常见的  int*  ptr,  当ptr++,  我们都知道,ptr会跨越一个sizeof(int)的距离,
那么 int (*parr)[5]  parr这是指向 int[5] 这样一个数组的指针, 当parr++, parr的值就变成 parr + sizeof(int[5]), 在指针的眼里,它能管理的最小单位就是它指向的类型,parr的类型是 int(*)[5],它管理的类型是 int[5]
对一个数组,int arr[5], &arr 和 &arr[5],它们两个是完全不同的东西,虽然在数值上它们是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 19:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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