C/C++指针

指针=指针变量,是个变量=存储着一个地址

1、*的理解:取值

 

②因为每次重新运行程序时,变量的地址是重新分配的,所以每次显示的地址都不一样。

p 表示变量a 的内存地址,*p表示取出变量a对应地址的值。(换句话说:指针是一个变量,既可以用p表示也可以用其它字母表示,只不过这个变量存储的是一个地址,指向内存的一个存储单元)

因此*(p+1)和p+1区别就很容易理解:

*(p+1):由于地址前加了*,所以表示指针p所指向的内存地址单元的下一个内存地址单元中的

p+1:由于p表示地址,所以p+1依然 表示地址,指针p所指向的内存地址的下一个内存地址

③看清楚是指针变量相减还是指针内容相减

迷惑性很强

2、&的理解

&是一个取地址符,&a表示变量a的地址(自己之前理解错误,收到scanf函数输入变量的影响)

但是,scanf("%d",&a); 表示从键盘接收一个整数存储到内存中&a所指的地址,也就是变量a中。

①变量地址的分配

	int x = 10;
	printf("%d", &x);

运行程序时,每次输出的值都不相同,这里就证明了&x输出的是地址而不是值

②&和*的理解

int x;

x = 10;

int *p;//说明了p为指针(又称指针变量),且用来指向int类型的变量(整数指针)

p = &x;//p就指向x了,地址赋给地址

一旦p指向x,x就相当于*p。也就是说,x与*p是等效的,代表同一个值。

再如

long *np, a = 4;

double *dp, d = 21.3;

np = &a; //执行此句后,*np的值为4

dp = &d; //执行此句后,*dp的值为21.3

*dp += (*np)++;

printf("*np = %ld, *dp = %.lf", *np, *dp);//输出5和4+21.3

地址对地址后,值就是相同了

③赋值

第二句虽然是在地址赋值,但赋值给指针ptr后,指向的内容就a变量的值

   对比理解:

简单理解就是:指针指向地址中的内容,但是赋值的是地址

地址赋值指针内容

地址赋值指针变量(因为前已经定义,所以省略*吗?),但是常数0不能直接赋值给指针变量,如下

常数赋值指针内容

常数0给指针变量后,指针就变成了空指针

 

3、指针自加运算

*it1++=*it2++:

运算顺序:先赋值*(it1)=*(it2),然后指针后移it1++,it2++

输出结果为abddcccd

注意初试化时,str、it1,it2都为abcdcccd

将it2除去c的字符赋值给it1的前四位,剩余四位没有改变

特殊说明:若在return str;前面加一句*it1 = '\0';这样输出就是abdd

4、数组-指针

赋值

①将数组名直接赋值给指针内容(变量名)(两种赋值方式都可以吗?)

int a[5];

*p=a;//p指向数组的第一个元素的地址

②将数组直接赋值给指针变量

调用函数时,p指向数组a的第一个元素,但在for循环中,有p=b,又把b的地址赋予了p,使p指向b的第一个元素,此时p与a已无关了。最终输出结果为“ABCDE”

③指针指向数组中的固定值:&和a+2(两种方法均可达到效果)

int a[4] = { 12, 16, 20, 30 };
	int* p =  _________________;  // 令p指向 a[2]

方法1:根据①,变量名赋值给指针可以知结果为:a+2 

有IDE自己还不尝试一下,主动,主动,主动!

第二句表示p指向 a[1],不要单单看成数组元素值赋值指针内容的关系,否则P[0]和p[1]不好理解。看做指针指向数组的关系

方法2:直接取a[2]地址:int* p = &a[2]; // 令p指向 a[2]

说明:只有指针能向数组后面移动,数组怎么可能出现a+2的情况呢!如下:

 

指针数组

①指针数组:大括号中有多个指针变量,每个指针指向不同内容

char*p1="hello";

char*p2="world";

char*p3="a piece of cake";

char*str[]={p1,p2,p3};

printf("%c",*(str[0]+1));

str[0] 为p1,p1指向的是"hello" p1指针+1 前进一位指向字符e。最后输出e,而不是输出hello

单独拿出来也要能理解:int   *p[4];         //指针数组。  大括号中有4个指针的数组, 每个元素都是指向整型的指针 

②数组指针?

int   (*p)[4];       //数组指针。 它是一个指针,指向有4个整型元素的数组。                 (一个指针指向有4个整型元素的数组)

举例:

5、字符串-指针

 

 

6、指针作为入口参数

①传递指针参数:实参为指针地址p,形参为*p

void sub(int *pb)

{

    *pb = 88; //执行这句的时候,需要将*pb替换成*pa,否则容易糊涂

}

int main(void)

{

    int x = 25;

    int *pa;

    pa = &x;  //指针pa指向变量x对应的地址

    sub(pa);  //注意此处调用的入口参数为pa,不是*pa,pa等于pb,将88存入x(注意存入的位置)

    printf("x = %d", x);

    return 0;

}

 

7、long型指针

void main()

{

char *p="abcdefgh",*r;

long *q;

q=(long*)p;

q++;

r=(char*)q;

printf ("%s\n",r);

}

q++;执行后,q指向字符串的第5个元素’e’,因为q是long型指针变量,增1相当于将q往后移动4个字符的位置。(常规情况下,指针都是int和char)

猜你喜欢

转载自blog.csdn.net/qq_20386411/article/details/88975469