伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

C语言指针的理解

来源:本站原创 浏览:93次 时间:2022-04-21
一:指针是什么
1. 指针是**变量**2. 指针是用来存放地址的变量(存放变量的地址),用来表示指定内存空间的地址。3. 地址的大小是**固定**的:占4个字节(32位系统)或者8个字节(64位系统)4. 指针**存在类型**,如整型指针、字符指针等,其类型决定了指针加减运算时移动的步长大小。同时指针可以进行**算术、关系运算**。
二:字符指针
    字符指针:是指存放char类型变量的地址的变量,称为字符指针。

字符指针可以有以下3中方式进行表示:
方式1:

char  a = 'c';char* p = &a;   // 把字符变量a的地址赋值给字符指针p*p = 'd';            // 修改字符指针p所指向内存空间存储的内容printf("%c\n", *p);  // 输出:d

方式2:

char arr[] = "abcdef";  // arr数组的长度为7,不是6char *p = arr;    // 数组名就是数组首元素的地址printf("%c\n", *p);  // 解引用后得到字符a                                输出:aprintf("%s\n", p);   // 输出字符指针p所指向的字符串               输出:abcdefprintf("%s\n", arr); // 数组名就是首元素的地址,故与p相同:输出:abcdef

方式3:

char *p = "abcdef"; // 该字符串是一个常量字符串,且把该字符串的首字符的地址放到字符指针p中// 该字符串在内存中的表示是:a b c d e f \0,把该字符串的地址存到字符变量p中,该地址为字符串首字符的地址。printf("%c\n", *p);  // p指向的是字符串首字符的地址,即'a'的地址,则解引用后,得到字符'a'; 输出:aprintf("%s\n", p);   // 把字符指针p所指向的字符串给打印出来, 输出:abcdef
2.1 常量字符串
  1. 常量字符串的内容是不能被修改的;
  2. 内存中只存在一份,多个字符指针指向相同的字符串,则这些指针中存放的地址相同;
  3. 将其赋值给字符指针时,是把其首字符的地址(其地址)赋值给(传给)字符指针。
    如下面例子:

    int main(){char* p = "abcdef"; // 该字符串是一个常量字符串,且把该字符串的首字符的地址放到字符指针p中*p = '1';printf("%s\n", p);   // 把字符指针p所指向的字符串给打印出来, 输出:abcdefreturn 0;}





    所以正确的写法:

    int main(){const char* p = "abcdef"; // *p = '1';                          // 此时编译都过不去的。printf("%s\n", p);   // 把字符指针p所指向的字符串给打印出来, 输出:abcdefreturn 0;}

    例子2:

    int main(){// 对于常量字符串,C会把其存储到单独的一个内存区域,当多个指针同时指向同一个字符串时,它们指向的是同一块内存// 但是用相同的常量字符串去初始化不同的数组时,就会指向不同的内存块。char arr1[] = "hello world"; // 将字符串放到数组arr1中,不是常量字符串char arr2[] = "hello world"; // const char* p1 = "hello world"; // 为常量字符串const char* p2 = "hello world"; // 为常量字符串,和上面的为同一个,为了节省内存空间,在内存中只储存一份if (arr1 == arr2)    printf("arr1 == arr2\n"); else    printf("arr1 != arr2\n");// 执行if (p1 == p2)    printf("p1 == p2\n");// 执行else    printf("p1 != p2\n");printf("arr1 and arr2's address = %p and %p\n", arr1, arr2); // printf("p1   and p2's   address = %p and %p\n", p1, p2);return 0;}


    注释:两个技术论坛网站:
    segmentfault.com(中国网站,段错误)
    stackoverflow.com(国外网站,栈溢出错误)

    三:指针数组

    指针数组:是指存放指针的数组,是一个数组,数组的元素是地址。
    如:

    int arr1[5] = {0}; // 整型数组,因为数组的元素是整型char arr2[5] = {0}; // 字符数组,因为数组的元素是字符类型int* arr3[3];           // 存放整型指针的数组----指针数组char* arr4[4];        // 存放字符指针的数组----指针数组

    理解指针数组的例子(但实际不是这么用指针数组的):

    int main(){int  a = 10;int  b = 20;int  c = 30;int* arr[3] = { &a, &b, &c }; // arr就是一个指针数组,且为一个整型指针数组,因为存放的是整型变量的地址。int i = 0;for (i = 0; i < 3; i++){    printf("%d\t", *(arr[i]));// 10 20 30}return 0;}

    指针数组的应用:

    int main(){int arr1[] = { 1,2,3,4,5 };int arr2[] = { 6,7,8,9,10};int arr3[] = { 11,12,13,14,15 };int* parr[3] = { arr1, arr2, arr3 };int i, j;for (i = 0; i < 3; i++){    for (j = 0; j < 5; j++)    {        // 以下三种写法都对:都可以一次打印每个数组的元素        // 找到数组的每个元素:parr[i],其中每一个元素是一个数组(arr1..3)        // +j表示找到指定数组中第j个元素的地址,在对其进行解引用,则找到对应的值        //printf("%d\t", *(parr[i] + j)); // 得到第i行的地址后向后偏移j的地址,再进行解引用        //printf("%d\t", parr[i][j]);        printf("%d\t", *(*(parr+i)+j));    }    printf("\n");}return 0;}

四:数组指针

数组指针:是一个指针,该指针指向的是一个数组

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net