C语言——指针的进阶

当我们学习C语言时,一般都会觉得指针这块是比较难理解的。而指针一般分为一级指针、二级指针、指针和数组、指针数组等。下面就是我对这几种的简单理解。指针实际就相当于地址,它是数据的唯一标识。

1.一级指针分为整形指针和字符指针

(1.)字符指针 ——类型为char * 型,就是指向字符(char)的指针。(相当于一个指针变量里存储的是字符的地址),如下面简单例子所示。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char ch = ‘w‘;
	char *p = &ch;
	//‘&‘为取地址操作符,即将ch的地址放在p中,此时p就是一个指针变量,它里面的内容就是ch的地址。
	*p = ‘y‘;
	/*
	‘*‘是解引用操作符,即将p中的内容解引用,而p中内容是ch的地址,解引用后即是ch地址里的内容是ch即为‘w’。
       */
	printf("%c\n", ch);//所以输出ch为‘y‘。
	system("pause");
	return 0;
}

(2.)整形指针——类型为int *型 ,就是指向整型的指针,即指针变量里存放的是整型(int)的地址。如下面简单例子所示。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int a = 200;
	int *p = &a;
	//‘&‘为取地址操作符,即将a的地址放在p中,此时p就是一个指针变量,它里面的内容就是a的地址。
	*p = 400;
	/*
	‘*‘是解引用操作符,即将p中的内容解引用,而p中内容是a的地址,解引用后即是a地址里的内容就是a即200。*/
	printf("%d\n", a);//所以输出a为400。
	system("pause");
	return 0;
}

其实一级指针还是比较容易理解的,只需要记住指针变量里存的是某种类型数据的地址,它一般的类型为(某种类型) *(指针变量){其中某种类型就是指针变量中存放的地址所属的数据的类型}。

2.二级指针——顾名思义,一级指针是存某种数据的地址,而二级指针就是指向指针的指针,即其指针变量存放的是一个指针的地址。一级指针类型为(某种类型) *(指针变量){其中某种类型就是指针变量中存放的地址所属的数据的类型}。所以二级指针的一般类型为(某种类型) **(指针变量){其中某种类型就是指针变量中存放的地址所属的指针的的类型}。如下例所示。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int a = 200;
	int *p = &a;//指针变量p内存放的是整型a的地址
	int **q = &p;//指针变量q内存放的是指针p的地址
	printf("%d\n", *p);//一次解引用后便是a的值
	printf("%d\n", **q);
        //第一次解引用后便是q的值是p的地址,而第二次解引用后是p的地址的值即整型a的值。
        //所以两次输出的结果一样都是a的值即200
	system("pause");
	return 0;
}

掌握一级指针和二级指针后,我们便会发现其实都是有规律的,所以也会发现多级指针也没有那么难理解了。比如一级指针是指向数据的指针,二级指针是指向一级指针的指针,那么三级指针便是指向二级指针的地址以此类推。只要记住,多级指针的指针变量内存的都地址。

3.指针数组

实际上指针数组就是数组,就像我们以前所学的数组是整形数组、字符数组那样,整形数组就是一个数组里存放的是整形数据,字符数组就是一个数组里存放的是字符数据没所以指针数组就是一个数组,里面存放的是一个一个的指针。但是它依旧是一个数组。如下所示

int *p[20];//整形指针的数组,数组里存放的全是整形指针(指向整形的)
char *arr[20];//字符指针的数组,数组里存放的全是字符指针(指向字符的)

4.数组指针

这与上述的指针数组比较容易弄混,但是只要记住名字后面是什么,那么它实际就是什么,意思就是说指针数组后面两个字是数组,它实际是个数组,而数组指针后面两个字是指针,它实际就是个指针。它如同我们以前所学的整形指针、字符指针。整形指针是指向整形的指针,字符指针是指向字符的指针,那么数组指针就是指向数组的指针。

int (*p)[10];//表示一个数组指针

下面是一个简单的使用数组指针的例子:

#include <stdio.h>
void print_arr(int (*arr)[5], int row, int col)
{
     int i = 0, j = 0;
     for(i=0; i<row; i++)
     {
          for(j=0; j<col; j++)
          {
              printf("%d ",arr[i][j]);
           }
           printf("\n");
     }
}
int main()
{
    int arr[3][3] = {1,2,3,4,5,6,7,8,9};
    print_arr(arr , 3 , 3);
    return 0;
}

原文地址:https://www.cnblogs.com/sheena/p/10824313.html

时间: 2024-07-31 12:57:42

C语言——指针的进阶的相关文章

C语言指针

C语言指针 指针是什么? 指针也是一个变量,但是这个变量存储的是一个地址,指向一个存储单元.我们可以根据指针(地址)找到他所指的变量,并对这个变量进行操作(赋值等).通过C里面的取地址符号&和取所指内容的符号*可以很方便的表示指针以及指针所指的变量之间的关系 /* ============================================================================ Name C语言指针 : text.c Author : Version : C

C语言--指针(一)

#import <Foundation/Foundation.h> //交换函数 void swap(int x, int y) { printf("x=%d,y=%d",x,y); int temp = 0; temp = x; x = y; y = temp; printf("x=%d,y=%d",x,y); } // void swap2(int *x , int *y) { //不改地址,改地址对应的值 printf("x=%d,y=%

C语言指针讲解

指针是C语言的一种数据类型,类似于C中的其他类型,例如int ,char 等.既然指针是一种类型,当我们定义该类型变量,该类型变量就称为指针变量. C中有了指针就有了指向.指向:指针变量指向本身保存的内容(地址或指针)所表示的内存单元. C语言指针是一个特殊的变量,其里面储存的数值被解释成为内存里的一个地址. 在计算机中,所有对数据的操作,都是通过其地址进行的,指针让程序的效率更高,代码更少. 在学习指针的时间,一定要理解并区分指针的四个感念:指针的类型,指针所指向的类型,指针的值,指针本身所占

[转]C 语言指针的使用

第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让 我们分别说明. 先声明几个指针放着做例子: 例一: (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文?lt;<如何

C语言指针的陷阱

C语言指针的陷阱   分类: C/Cpp 转自:http://blog.csdn.net/porscheyin/article/details/3461670 "C语言诡异离奇,陷阱重重,却获得了巨大成功!"--C语言之父Dennis M.Ritchie.Ritchie大师的这句话体现了C语言的灵活性以及广泛的使用,但也揭示了C是一种在应用时要时刻注意自己行为的语言.C的设计哲学还是那句话:使用C的程序员应该知道自己在干什么.有时用C写的程序会出一些莫名其妙的错误,看似根源难寻,但仔细

C语言指针占用字节

指针即为地址,存的是变量的地址,在同一架构下地址长度都是相同的(cpu的最大寻址内存空间),所以不同类型的指针长度都一样. 指针占用几个字节跟语言无关,而是跟系统的寻址能力有关,16为地址指针即为2个字节,32位系统是4个字节,64位系统为8个字节. 用sizeof求长度: #include<stdio.h> void main(void) { printf("%d %d %d\n",sizeof(int),sizeof(double),sizeof(char)); } 在

关于c语言 指针课堂随笔

右左法则:首先从最里面的圆括号看起,然后往右看,再往左看.每当遇到圆括号时,就应该掉转阅读方向.一旦解析完圆括号里面所有的东西,就跳出圆括号.重复这个过程直到整个声明解析完毕 1.指针的判断应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个 实例: int(*func)(int*p)    先从标识符func找起往右走  碰到圆括号 反转 从左走 func的指针  再往右碰到圆括号这是个函数    func是指

c语言指针学习

前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水,食品,你能告诉还有没有问题的吗?不知大难至,世人依旧忙.祸福相依,危中有机.那些高级生命,出于慈悲,会救渡我们,但是你要去思考,去发现机缘. 最近较闲,没事就学点基础知识,整天在上层晃,感觉晕的厉害,接地气.关于指针我上学的时候学过一点,我的老师说"指针很难呢",当时以为这老师挺谦虚的.后

C语言指针,你还觉得难吗?

在研究式学习-c语言程序设计指针式这样介绍的: 内存中存储变量的第一个单元的地址 称为指针,存放指针的变量称为指针变量: 变量的访问方式有: 直接访问方式:按变量名查找其首地址 间接访问方式:通过指针访问 int swap(int p,int q){ int temp; temp=p; p=q; q=temp;} 现在理解了这个函数为什么要用指针了: 因为C语言中实参变量和形参变量之间的数据传递是单向的值传递方式,虽然运用指针被调函数不能改变实参指针变量的值,但可以改变实参指针变量指向的变量的值