关于指针变量的问题
我只知道指针变量一开始是来保存地址的比如int a = 123;
int *p;
p = &a;
p保存的就是a的地址,而p也有属于自己的地址
但是如果我直接*p = 123; 或*p = {1,2,3};他是不是就相当于一个普通的变量了?
还有普通变量和指针变量有什么区别 本帖最后由 两手空空儿 于 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 10:05
普通变量和指针变量没有什么区别,都是普通变量,只是指针是带*的类型
int a = 123; 普通变量a, 类型in ...
我还想问一个问题字符数组为什么可以存放中文字符
char *p = {
'卧槽这是为什么'',
"而且我打印p的尺寸是8为什么是8了难道他保存的是地址?",
"而打印*p的尺寸是1",
"可不可以说一下字符数组保存中文在内存中是怎么样的",
"其实我有点不好意思问的但是想了半天也没想出来所以还是问了"
}; 摸你穷 发表于 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: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-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-6 13:09
1、电脑里可以存放的只有 0 1 ,也就是说只能存储数字,没有文字,要想让来表示人能看懂的字符,前人做了 ...
老兄有些小问题想问你,我个人对指针数组和数组指针的理解问题
指针数组:跟普通数组差不多这是可以保存地址,就是数组里面保存指针
数组指针:我还不是很理解,但大概是指针保存数组
想请你看看我理解的对不对麻烦在科普科普 摸你穷 发表于 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]