摸你穷 发表于 2023-2-3 23:05:40

关于指针变量的问题

我只知道指针变量一开始是来保存地址的比如

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

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

但是如果我直接*p = 123; 或*p = {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 = {1,2,3};   这是一个指针数组, 它是数组,有3个元素, 每个元素是一个【int*类型】的指针, 3个元素的值分别是 1, 2, 3

摸你穷 发表于 2023-2-4 23:29:17

两手空空儿 发表于 2023-2-4 10:05
普通变量和指针变量没有什么区别,都是普通变量,只是指针是带*的类型
int a = 123;    普通变量a, 类型in ...

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

char *p = {
      '卧槽这是为什么'',
      "而且我打印p的尺寸是8为什么是8了难道他保存的是地址?",
      "而打印*p的尺寸是1",
      "可不可以说一下字符数组保存中文在内存中是怎么样的",
      "其实我有点不好意思问的但是想了半天也没想出来所以还是问了"
};

人造人 发表于 2023-2-5 09:51:36

摸你穷 发表于 2023-2-4 23:29
我还想问一个问题字符数组为什么可以存放中文字符

char *p = {


也是数字

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);
    }
    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$

jackz007 发表于 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 = {1,2,3}
      这种形式只允许出现在变量的定义中,因为这是在指示编译器预留和初始化变量存储空间,运行时是绝对不允许这样(用数组给变量赋值)赋值的。
      至于可以用字符数组保存汉字的问题,没有什么好奇怪的,我们知道,字符数组可以用来保存字符串,无论是英文字符还是中文字符,被保存的都是字符的编码,对于西文字符,每个字符对应一个 ASCII 编码,这个编码占用一个 char,对于中文字符,操作系统缺省采用 'GBK' 编码,每个汉字占用 2 个 char。当按照字符打印这些编码的时候,操作系统会自动把这些数字(字符编码)兑换成对应的中、西文字符,并进行显示输出。

两手空空儿 发表于 2023-2-6 13:09:56

摸你穷 发表于 2023-2-4 23:29
我还想问一个问题字符数组为什么可以存放中文字符

char *p = {


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, 这个一个数组,存放的是指针,打印p的尺寸其实打印的是p的尺寸,你是64位系统,所以是8; *p 其实就是*p, p是一个char*,它指向的就是一个char, *p的尺寸就是1(一个char)

摸你穷 发表于 2023-2-18 23:55:53

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

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

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

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

想请你看看我理解的对不对麻烦在科普科普

两手空空儿 发表于 2023-2-19 12:18:35

摸你穷 发表于 2023-2-18 23:55
老兄有些小问题想问你,我个人对指针数组和数组指针的理解问题

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

数组指针,首先它是一个指针,它指向一个数组,虽然它的值和数组的起始地址相同,但是指向的是整个数组,
常见的int*ptr,当ptr++,我们都知道,ptr会跨越一个sizeof(int)的距离,
那么 int (*parr)parr这是指向 int 这样一个数组的指针, 当parr++, parr的值就变成 parr + sizeof(int), 在指针的眼里,它能管理的最小单位就是它指向的类型,parr的类型是 int(*),它管理的类型是 int
对一个数组,int arr, &arr 和 &arr,它们两个是完全不同的东西,虽然在数值上它们是一样的
页: [1]
查看完整版本: 关于指针变量的问题