关于指针,我对初学C语言的同窗们真的有话要说!3

这一偏距离上次说指针,时间是有点长了,主要是这几天上班有点累。好了,今天恢复了一下,让我们将继续侃吧!

上一次我们提到了一般的变量,同时也说了指针变量。这样的话我们应该认识到这两种变量有什么异同了吧。

什么什么,您还在迷糊,没关系,让我再来说一遍。

我们说定义了一个变量实际上是分配的一定字节的存储空间,所以这个存储空间就有他的首地址,首地址就是我们平常的指针常量,同时从首地址开始的若干个字节也就成了我们定义变量的内容了。也就是说int a;a的地址&a是一个指针常量(注意常量也就是不能变化的量),而这时我们又定义了一个变量int* p;这时我们定义了一个指针变量,p的地址&p是也是一个指针常量(注意常量也就是不能变化的量),而p是一个指针变量,这时的p的内容是一个随机的值,并未指向任何可确定的合法的地址,所以,访问p的内容如另*p = 0;有极大的可能是;程序失控,因此一般的我们会让p = &a;也就是把一个确定的合法的指针常量赋予p这个指针变量。而&p在这里我们是用不到的,这里我们知道p的地址是没有什么用的。但是在有些情况,我们又定义了一个int** pp;是就会有用了,这是,我们的变量pp是一个指针变量,也分配4个字节的存储空间,不过他的类型是一个整型指针的指针变量,也就是说pp的内容,要是&p的值才会没有问题。而&p是一个常量即是p的地址。依次类推的情况下&pp也是一个常量,我们可以无休止的int*** p;这样当然是可以的,但是却从不同程度上加大我们理解程序的难度。

不知道你有没有看到过这样的定义, char* addr = (char*) 0xb800;

addr 这个字符指针变量就指向,一个b800h处,如果是一个应用程序,你可能永远也不会用到它,可是操作系统之类的程序里,就会是一个经常用到的东西。

#include <stdio.h>

int main(void) {
    char c;
    printf("0x%x\n", &c);

//###############################
    *((char *)0x28ff3f) = '$';
    printf("%c\n", c);
}

上面的这段程序,之所以用这样的形式,就是要说明指针的问题。

第一上面的这个程序不是一次得到的,我们先要运行#上面的,然后得到那个常量0x28ff3f,这样我们就可以像上图那样为常量的*号的形式赋值,实际上就是为c赋值,因此我们打印出的字符变量c就是'$'。而这样的形式对于初学指针或者是c的小朋友们可能就天书的感觉,也难怪,如果这是没有指针的深入理解,看到的就是字符,绝对不会理解他的真意。

本来今天想说道这里就行了,不过还是想多唠叨几句,那就是数组。

如果我们这样的定义了一个数组,char str[10],你是怎么理解的呢?

好了不卖关子了,让我们精确而深刻的分析一下吧,要是按照某些教科书上的说法的话,就仅仅是定义了一个数组,而且分配了10个字节的存储空间。是的这也没什么错,不过如果是仅仅这样简单的描述的话,上学的同学们就会错过好多回后,才恍然大悟,而那时候他们都可能已经非常地讨厌c语言了。

我们怎么解释呢?

第一我们要看str是个什么东西,str是变量吗?它是变量吗?是吗?我不禁的问了3遍,当然是否定。

恰恰定义了一个数组后str是一个地址的常量,它指向了数组的开端。

那么这时候变量在哪里?偏偏变量是str[0], str[1], str[2].... 等共10个

#include <stdio.h>

int main(void) {
    char c;
    printf("0x%x\n", &c);
    *((char *)0x28ff3f) = '$';
    printf("%c\n", c);
    char str[10];
    str[0] = '#';
    char* sp = str;
    sp++;
    sp++;
    *sp = '@';
    *(str + 1)= '&';
    *(++sp) = '%';
    printf("%c %c %c %c", str[0], 1[str], *(sp - 1), sp[0]);
}

上面这段程序会让你对数组,指针有一个全新的理解,同时也让你看到了c语言的灵活或者或者说是有点混乱,虽然的本意并不是炫耀,但是可能我内心还是要炫耀他,毕竟只有在很少c书中才会有人愿意深刻的说说他。

好了今天就到这里了,还是好好休息一下吧

发布了159 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_39410618/article/details/102510330
今日推荐