概述
引言:本篇再一次写到指针,学过c语言的都知道,指针是初学c语言时候遇到的一个比较难搞的知识点。你尽管可以想的简单,但是其实如果去用的话,没有一个更加深入的理解,那么后续的学习到数据结构就会艰难无比。
指针?c语言的灵魂所在。本篇还是会结合数组来讲,当指针和数据结合起来的时候就会变得奇妙无比。提高一点点的难度,记得第一次也写过c语言的指针,只不过相对简单。第一篇c语言指针的链接如下
c语言指针的有关总结
深入理解c语言指针与数组
- c语言指针与数组
- 一: 指针的理解与操作
- 1:指针与指针变量?
- 2:二级指针,多级指针,指向指针的指针?
- 指针占用空间?难道会同指向的类型变量的大小一直一致吗?
- 3:定义指针的*号与后面引用p取的 *号一样吗?
- 二: 数组理解与操作
- 1:定义初始化
- 2:给数组赋值
- 1:给整形数组赋值
- 2:给字符型数组进行赋值
- 2:一维数组?二维数组?三维数组?
- 三: 指针与数组的复杂纠葛
- 1:指针与数组
- (1)指向一维数组
- (2)指向二维数组
- 2:指针数组
- 3:数组指针
- 四:给你一些相关的内容以及遇到的问题
c语言指针与数组
一: 指针的理解与操作
1:指针与指针变量?
指针是什么?以及指针地址的概念?
指针就是地址,地址就是指针。指针变量可用于存放地址。
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。
将指针的等同于指针变量是不严格的说法,指针并不是存放地址,指针变量才可以存放地址。我们从概念上区分。但是可能会通常会把指针变量也简化称之为指针了,但是我们需要知道,实际上并不等同。
然后我们简单写代码也可以验证这个说法
#include<stdio.h>
#include<windows.h>
int main()
{
int a = 0;
int *p = &a;//定义了指针变量存放了a的地址
printf("the address of a is %dn",&a);
printf("the value of p is %d or %pn",p);
system("pause");
}
2:二级指针,多级指针,指向指针的指针?
这边的指针大家在代码中就理解为指针变量就可,这样严格一些就不会弄混。
我们定义一个指针变量,既然是一个变量,那肯定需要空间,或者叫内存空间,既然是占用了内存空间,那必然会有地址,既然是有地址,我们必然可以定义另一个指针来存放该指针变量的地址。所以可以称之为双重指针。
下面展示一些 内联代码片
。
#include<stdio.h>
#include<windows.h>
int main()
{
//指向指针的指针
int *p1 = NULL;
int a1 = 6;
p1 = &a1;
int **p2 = &p1;
printf("the value of address of a is %dn",&a1);
printf("the value of p1 is %dn",p1);
printf("the address of p1 is %dn",&p1);
printf("the value of p2 is :%dn",p2);
printf("the value of *p2 is :%dn",*p2);
printf("the value of **p2 is %dn",**p2);
printf("the value of address of p2 is %dn",&p2);
system("pause");
}
指针占用空间?难道会同指向的类型变量的大小一直一致吗?
当然不是啦!
加一些代码,分别定义两个指针,一个指向charl类型,一个指向int类型,下面输出两者各占的字节数。
3:定义指针的*号与后面引用p取的 *号一样吗?
不一样啊!
int *p 这边的 *号是作为了区分指针与一般变量的符号,定义这边只说明了该变量是指针。而你在后面所用到的 *p我们可以认为是取该指针指向地址处得值得含义。上边的代码也有说明打印。所以这个也算作是一个容易混淆的区分点。
下面展示一些 内联代码片
。
#include<stdio.h>
#include<windows.h>
int main()
{
//指向指针的指针
char a ='c';
char *p =&a;
int *p1 = NULL;
int a1 = 6;
p1 = &a1;
int **p2 = &p1;
printf("the value of address of a is %dn",&a1);
printf("the value of p1 is %dn",p1);
printf("the address of p1 is %dn",&p1);
printf("the value of p2 is :%dn",p2);
printf("the value of *p2 is :%dn",*p2);
printf("the value of **p2 is %dn",**p2);
printf("the value of address of p2 is %dn",&p2);
printf("the size of a is %dn",sizeof(a));
printf("the size of a1 id %dn",sizeof(a1));
printf("the size of p is %dn",sizeof(p));
printf("the size of p1 is %dn",sizeof(p1));
system("pause");
}
可以看到两个指针都占四个字节,虽然指向不同的类型。所以说指针所占的内存数和指向的数据类型是没有关系的。
二: 数组理解与操作
1:定义初始化
普通的一维数组也就没什么太大的区别了,要说区别话,也可能只是类型的问题。
(1)初始化一维数组
一写可以尝试的初始化,这里就举例数值型和字符型
#include<stdio.h>
#include<windows.h>
int main()
{
int a[] = {};
int a1[] = {1,2,3,4};
int a2[5] = {};
int a3[5] = {1,2,3,4,5};
char s1[] = {"Hello Everyone"};
char s2[] = {'a','b','c','