hackerchai / blog

My Personal Blog Repo
https://blog.hackerchai.com
MIT License
0 stars 0 forks source link

10分钟解惑C语言指针 :: Hackerchai's IT Blog #14

Closed hackerchai closed 9 months ago

hackerchai commented 4 years ago

https://blog.hackerchai.com/post/c-language-pointer/

前言 最近才在备战OI,我之前对C指针的理解是:指针本身是一块内存,它保存了一块内存的地址,但是经常对一些概念有混淆,于是今天就细致的研究了一下指针的详细用法和原理。 指针 先看这样一段代码:

include <stdio.h>int main() { int i = 10; int p; printf("p的地址:%d\n",&p); printf("未初始化时p的内容:%d\n",p); p = &i; printf("--初始化p完毕--\n"); printf("p里面保存的地址:%d\n",p); printf("p指向的内存的内容:%d\n",p); printf("p的大小:%d\n",sizeof(p)); printf("p指向的内存大小:%d\n",sizeof(*p)); return 0; } 输出结果为:

p的地址:1439276008 未初始化时p的内容:0 --初始化p完毕-- p里面保存的地址:1439276020 p指向的内存的内容:10 p的大小:8 p指向的内存大小:4 这就是指针的基本使用,可用下图来说明: 指针与数组 首先看这两个声明语句 char (a) [100]; char a [100]; 第一个是声明了一个指向有100个char元素的数组的指针(注意和指向数组首地址的char型指针分开);第二个是声明了一个有100个char元素的数组,数组里面装的是char 。 为了理解,我们来看这样一段代码:

include <stdio.h> int main() { int arr[10][100]; printf("sizeof(arr[0]) = %lu\n", sizeof(arr[0])); printf("sizeof(arr[0][0]) = %lu\n", sizeof(arr[0][0])); int p; int (q)[100]; p = &arr[0][0]; q = &arr[0]; printf("p = %d\n",p); printf("q = %d\n",q); printf("sizeof((p)) = %lu\n", sizeof((p))); printf("sizeof((q)) = %lu\n", sizeof((q))); p++; q++; printf("after add 1, p = %d\n", p); printf("after add 1, q = %d\n", q); return 0; } 这端代码运行后结果如下: