C语言指针问题

  1. C语言有关指针的变量声明中方式与易错点

  • C语言允许形式的自由性。即以下两种声明方式效果相同。
1 int main(void)
2 {
3     int* p;
4     int *k;
5     return 0;
6 }
  • 同时声明多个指针变量   

    

 1 int main(void)
 2 {
 3     // 声明三个指针变量
 4     // 每个变量分开加入*
 5     int *p, *a, *b;
 6
 7     // 仅p为指针变量,a与b为普通变量
 8     int *p, a, b;
 9     return 0;
10 }

  2. “指针常量" 和 “指向常量变量”

      

1 int main(void)
2 {
3     int const *p;
4     const int *p;
5     int * const p=0;
6     return 0;
7 }

      

      注:如果需要更加理解这个问题  需要参考一下C语言运算符的结合性。

        

      3     int const *p   等价于   const int *p;  指针常量,原因,根据运算符结合性, *属于双目运算符由右至左结合可以得之,*p 是一个常量

        能修改指针本身的值,但是不能修改其指向的值。

   4     const int *p;  能修改其指向的整型的值,但是不能修改指针本身的值。从变量标识符开始(即从右向左),const修饰p,表示p是常量

,即不能修改p本身,但p指向的值可以修改。

int main(void)
{
    int const *p;
    int a = 5;
    int b = 2;
    p = &a; // 可以改变p的地址 但是不可以对*p 赋值。
    printf("&a的值向是= %d\n", *p);
    p = &b;
    printf("&b的值向是= %d\n", *p);

    int * const k =&a; // 初始化的时候就需要进行赋值
    printf("%d \n", *k);
    *k = 9;  /*可以改变指针p 指向的值*/
    printf("%d \n", *k);

}

    

3. 关于指针和数组若干关系

int main(void)
{
    int a[10];
    int *p = a; 

    //单独的数组名a相当于第一个元素的地址,即&a[0]

    // 单独的数组的首元素地址。

    printf("&a[0]的地址 = %p\n", &a[0]);
    printf("a的地址     = %p\n", a);
        return 0

}

       

4. 关于a[0]和&a 的区别 ------省政府和市政的区别(来自C语言中文网)

     

这里&a[0]和&a 到底有什么区别呢?a[0]是一个元素,a 是整个数组,虽然&a[0]和&a的值一样,但其意义不一样。前者是数组首元素的首地址,

而后者是数组的首地址。举个例子:湖南的省政府在长沙,而长沙的市政府也在长沙。两个政府都在长沙,但其代表的意义完全不同。这里也是同一个意思。

   5. 关于指针加 “1”的问题

      

1 int main(void)
2 {
3     int *p = (int*)5;
4     printf("%p\n",p);
5     p++;
6     printf("%p\n",p);        char *q = (char*)5;      q++;      printf("%d", q);
7 }

              (ps: q的结果为6)

结果显示为 我们可以猜测到  指针加 “1”相当于加一个其指向的字节数。

          

          接着看我举例子,继续理解这个问题

       

int main(void)
{
    int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int *p;
    for (int i = 0; i < 10; i++)
    {
        printf("&a[%d]的地址=%p\n",i, &a[i]);
    }

    p = a;

    for (int i = 0; i < 10; i++)
    {
        printf("*(p+%d)的值 = %d--------a[%d] = %d\n",i, *(p + i),i,a[i]);

    }
}

        

        

int main(void)
{
    int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
    printf("a[3]     = %d\n", a[3]);
    printf("*(a + 3) = %d\n", *(a + 3));
    printf("3[a]     = %d\n", 3[a]);
    printf("*(3 + a) = %d\n",*(3+a));
    return 0;
}

        通过这个例子我觉得大家能能猜到点什么 。

        OK 了 我觉得大致借个问题解决了。  放松一下来点嘻唰唰。  我caca   忘记了 还有一个 指针和数组的

  附录A

分析指针,可以从变量名处起,根据运算符优先级结合,一步一步分析.

int p; //这是一个普通的整型变量

int *p; //首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,说明指针所指向的内容的类型为int 型.所以 P是一个返回整型数据的指针

int p[3]; //首先从P处开始,先与[]结合,说明P 是一个数组,然后与int结合,说明数组里的元素是整型的,所以 P是一个由整型数据组成的数组

int *p[3]; //首先从P处开始,先与[]结合,因为其优先级比*高,所以P是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与 int结合,说明指针所指向的内容的类型是整型的,所以是一个由返回整型数据的指针所组成的数组

int main(void)
{
    int  *p[5];
    int a = 0;
    int b;
    int c;

    p[0] = &a;
    p[1] = &b;
    p[2] = &c;

    *p[0] = -1;
    printf("%ld,%ld\n",sizeof(p),sizeof(int * [5]) );
    printf("a = %d\n", a);

    int *k[10];
        printf("%ld,%ld\n", sizeof(k), sizeof(int *[10]));
        return 0;
}
    

int (*p)[3]; //首先从P处开始,先与*结合,说明P是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P是一个指向由整型数据组成的数组的指针

int **p; //首先从 P开始,先与*结合,说明P是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与 int结合,说明该指针所指向的元素是整型数据. 所以P是一个返回指向整型数据的指针的指针

int p(int); //从P处起,先与()结合,说明P是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数然后再与外面的int 结合,说明函数的返回值是一个整型数据.所以P是一个有整型参数且返回类型为整型的函数

int (*p)(int); //从P处开始,先与指针结合,说明P是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P是一个指向有一个整型参数且返回类型为整型的函数的指针

int *(*p(int))[3]; //从 P开始,先与()结合,说明P是一个函数,然后进入()里面,与int结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P是一个参数为一个整数且返回一个指向由整型指针变量组成的数组的指针变量的函数

时间: 2024-10-12 04:18:37

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语言中实参变量和形参变量之间的数据传递是单向的值传递方式,虽然运用指针被调函数不能改变实参指针变量的值,但可以改变实参指针变量指向的变量的值

C语言指针解说

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