知识点8:指针的基本知识

指针的基本知识

1,指针变量的定义与赋值

指针变量与普通的变量一样,需要定义和赋值,未经赋值的指针变量不能使用。

//指针变量的定义和赋值
//可以先定义后赋值
int *p;   //应该理解为变量p的类型为 int* 型
p = &a;   //单独赋值时,不要再加 * 
//也可以在定义的同时进行赋值
int *p = &a;

注意:不允许把一个数值赋给指针变量

2,指针变量的基本引用

int* p = &a;
scanf("%d", p);//在与地址相关的操作中,p默认为一个地方,此处直接将输入的值存入p指向的地方中
printf("%d", *p);//*p即指针变量p所指向的值

3,指针的运算

指针的运算与它所指向的数据类型的长度有关
例如:

int*p = &i;//设i的地址为2000
p ++;//因为i为整型,占2个字节,所以p++的结果为2002

4,运用指针来操作数组

数组名就是数组在内存中的首地址,数组名是地址!

int a[10];
p = a;//赋值时直接将数组名赋给指针变量即可
//对于一维数组
int a[10], i, *p;
for (p = a; p < a + 10; p ++)
	scanf("%d", p);
//也可 for (p = a, i = 0; i < 10; i ++)scanf("%d", p++);
for (p = a; p < a + 10; p ++)
	printf("%d ", *p);
//也可 for (p = a, i = 0; i < 10; i ++)printf("%d ", *p++);       注意:*p++与*(p++)等价     
//也可 for (i = 0; i < 10; i ++)printf("%d ", *(a+i) );  通过数组名计算数组元素的地址, a+i是数组元素a[i]的地址,a为常量,不能改变值,因此需要引入变量i来实现叠加 
//对于二维数组
for (i = 0; i < 3; i ++)
	for (p = a[i]; p < a[i] + 3; p ++)//注意单位元应是单个数组元素!
		scanf("%d", p);
/*也可以为:
for (i = 0; i < 3; i ++)
	for (j = 0; j < 3; j ++)
		scanf("%d", a[i] + j);
还可以为:
for (p = a[0], i = 0; i < 3; i ++)
	for (j = 0; j < 3; j ++)
		scanf("%d", p ++);
数组的地址是连着的,因此也可以直接为:
for (p = a[0], i = 0; i < m * n; i++)
	scanf("%d", p ++);                        */
for (i = 0; i < 3; i ++)
	for (p = a[i]; p < a[i] + 3; p ++)
		printf("%d ", *p);
/*也可以为:
for (i = 0; i < 3; i ++)
	for (J = 0; J < 3; J ++)
		printf("%d ", *(a[i]+j));
还可以为:
for (p = a[0], i = 0; i < 3; i ++)
	for (J = 0; J < 3; J ++)
		printf("%d ", *p++);     */

5,指针的相关表示

首先要牢记:p[ i ] = *( p + i )
其次要注意:指针不是只包括地址那一串数字,还包括类型

	printf("%d\n", &a[1][0]);//假设为2000
	printf("%d\n", a+1);//2000
	printf("%d\n", *(a+1));//2000
	//地址数值相同,但 *(a+1) 与 **(a+1)却并不相同
  • 对于一维数组:
    • a[ i ] = *( a + i )
    • a = &a[ 0 ]   a + i = &a[ i ](加法单元为单个元素)
    • p = a    ⟺    \iff p = &a[ 0 ]   p = a + i    ⟺    \iff p = &a[ i ]
    • *a = a[ 0 ]
  • 对于二维数组:要注意a[ i ]为“数组名”,是一个地址
    • a作为一个二维数组,研究对象为多个一维数组;*a就是更深入一层,成为一个一维数组,研究对象也转为每个一维数组的单个元素层次;**a又细化一层,成为单个数组元素。
    • *a = a[ 0 ] (细化为一维数组)  **a = a[ 0 ][ 0 ](细化为单个元素)
    • 从数值上看,a的值也为a[ 0 ]的首地址,即a[ 0 ][ 0 ]的地址
    • a + i 是以一维数组的长度作为加法单元。数值上,a+i的值即第i行数组元素的首地址。应仍将a+i视作二维数组。
    • *(a+i) = a[ i ](细化为一维数组)  **(a + i) = a[ i ][ 0 ](细化为单个元素)  *(*a+i) = a[ 0 ][ i ](细化到单个元素)
    • a[ i ] + k (第i行第k列的地址)= *(a + i) + k = &a[ i ][ k ]
    • a[ i ][ k ] = *(a[ i ] + k) = *(*(a + i) + k)
    • *a[ i ] = a[ i ][ 0 ]
    • 注意 a + i ≠ \neq = a[ 0 ] + i   a + i (行) ≠ \neq = *a + i(单个元素)

猜你喜欢

转载自blog.csdn.net/Shao_yihao/article/details/113181245
今日推荐