欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

C语言入门经典——基础知识(指针 数组 多维数组)

发布时间:2025/10/17 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 C语言入门经典——基础知识(指针 数组 多维数组) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

关于指针与数组的总结如下



语句的解释与说明

int number = 5; ==》》这条语句会分配一块内存来存储一个整数,使用number名称可以访问这个整数。

Int *pnumber = &number;==》》pnumber的初值是number变量的地址。

一维数组x[n1]==》》[n1]放在数组名称之后,告诉编译器它是一个有n1个元素的数组。

二维数组y[n1][n2]==》》编译器会创建一个大小为n1的数组,它的每个元素是一个大小为n2的数组。


通过指针

访问值(变量、一维数组、二维数组)

int number = 99;

int   *pnumber =  &number;

%p-->(void*)&pnumber == 》》pnumber的地址(pnumber所占的内存位置的第一个字符)

                转换为 void* ,可以禁止编译器发出警告。

%p-->pnumber==》》存储在pnumber的值(它是number的地址)

%d-->*pnumber==》》pnumber所含的地址中存储的值(它是存储在number中的值)

                 *运算符的作用是访问存储在pnumber中的地址的数据。

char multiple [] = "a string";

char *p = multiple;

%p-->(p+i)==》》数组中每个元素的地址。

%c-->*(p+i)==》》数组中每个元素的值。

                其是给p中的地址加上整数i,再对得到的地址取消引用,结果等同multiple[i]

char board[3][3] = {

            {'1','2','3'},

            {'4','5','6'},

            {'7','8','9'}

};

char *pboard = *board;

%p-->board==》》是char型二维数组的地址     char**类型

                   *(*board + i)  或者 *(*pboard+i)  可以得到二维数组中的所有值

               *board取消了对board的引用。因为board是指针的指针,是数组中第一个元素board[0]的地址,

%p-->board[0] ==》》是char型一维子数组的地址

%p-->&board[0][0] ==》》是char型数组元素的地址

%c-->**board 或者 *board[0] 或者 board[0][0]==》》获取第一个元素的值

                 




****************************************指针***************************************

******************************能够存储地址的变量称为指针*****************************

指针的声明:

    int *pointer = NULL;   或者  int *pointer = 0;

    测试指针是否为空:if(!pointer)  或者  if(pointer != NULL)

    声明一个指向int类型变量的指针,pointer变量的类型是 Int *,它可以存储任意Int类型变量的地址。

    NULL是标准库中定义的一个常量,对于指针它表示0。NULL是一个不指向任何内存位置的值。这表示,使用不指向任何对象的指针,不会意外覆盖内存。

    我们知道变量pointer是一个指针是不够的,更重要的是,编译器必须知道它所值的变量的类型。没有这个信息,根本不可能知道它占用多少内存,或者如何处理它所指的内存的内容。

 用已声明的变量地址初始化pointer变量,可以使用寻址运算符&,例如:

    int  number = 10;

    int *pointer =  &number;

    第一条语句会分配一块内存来存储一个整数,使用number名称可以访问这个整数。

    pointer的初值是number变量的地址。两句的顺序不能颠倒,编译器要先分配空间,才能使用number的地址初始化pointer变量。


    number 和 pointer 的地址是变量在这台计算机上存放的地方。

    number变量是一个整数(10),但是pnumber变量是number的地址。

    使用*pnumber可以访问number的值,即间接地使用number变量的值。

  指针的使用:(说明:使用一个指针变量可以改变其它许多变量的值,但是变量的类型要相同)

#include<stdio.h> int main() {long num1 = 0L;long num2 = 0L;long *pnum = NULL;pnum = &num1; //get address of num1*pnum = 2; //set num1 to 2++num2; //increment num2printf("num1=%ld num2=%ld\n",num1,num2);// 2 1num2 += *pnum; //add num1 to num2printf("num1=%ld num2=%ld\n",num1,num2);//2 3//指针重新指向了 num2pnum = &num2; //get addres of num2l++*pnum;//increment number2 indirectly //(++*pnum递增了pnum指向的值 == (*pnum)++ ) //如果省略括号,就会递增pnum所含的地址,printf("num1=%ld num2=%ld\n",num1,num2);//2 4printf("\nnum1=%ld num2=%ld *pnum=%ld *pnum+num2=%ld\n",num1,num2,*pnum,*pnum+num2);//2 4 4 8return 0; }

指针与常量:

    指向常量的指针:

        可以改变指针中存储的地址,但是不允许使用指针改变它指向的值。

long value = 999L;const long *pvalue = &value;//把pvalue指向的值声明为const //可以通过value改变 pvalue指向的值,但是不能通过pvalue指针做这个改变*pvalue = 888L;//error: assignment of read-only location ‘*pvalue’value = 777L;//pvalue指向的值不能改变,但是可以对value进行任意操作 //指针本身不是常量,所以仍可以改变它指向的值。long number = 666L;pvalue = &number;

    常量指针:

        指针中存储的地址不能改变,但是可以使用指针改变它指向的值。

int count = 43;int *const pcount = &count;printf("==%d\n",*pcount); //43int item = 34; // pcount = &item;//error: assignment of read-only variable ‘pcount’*pcount = 345;//通过指针引用了存储在const中的值,将其改为345printf("==%d\n",*pcount);//345

 指向常量的常指针:

        指针中存储的地址不能改变,指针指向的值也不能被改变。

int itemm = 25;const int *const pitem = &item;

****************************************数组***************************************

**********************************相同类型的对象集合*********************************

   //数组与指针的区别是:可以改变指针包含的地址,但是不能改变数组名称引用的地址

//数组名称本身引用了一个地址char multiple[] = "My string";char *p = &multiple[0];printf("The address of the first arry element:%p\n",p);//The address of the first arry element:0x7ffddba45350 p = multiple;printf("The address obtained from the array name:%p\n",p);//The address obtained from the array name:0x7ffddba45350

//多维数组


int main() {char board[3][3] = {{'1','2','3'},{'4','5','6'},{'7','8','9'}};printf("value of board[0][0] : %c\n",board[0][0]);printf("address of board[0][0] : %p\n",&board[0][0]);printf("value of *board[0]: %c\n",*board[0]);printf("address of board[0]: %p\n",board[0]);printf("value of **board : %c\n",**board);printf("address of board : %p\n",board);for(i=0;i<9;i++){printf("board:%c\n",*(*board+i));}return 0; } value of board[0][0] : 1
address of board[0][0] : 0x7ffee67e6f50
value of *board[0]: 1
address of board[0]: 0x7ffee67e6f50
value of **board : 1

address of board : 0x7ffee67e6f50

board:1                 board:2                   board:3                board:4              board:5
board:6                 board:7                   board:8                board:9




《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的C语言入门经典——基础知识(指针 数组 多维数组)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。