指针基础入门

 图中的int *p = &k;

int *p  是声明了一个整型指针变量  p  ,它用于存储一个指向  int  类型数据的地址。而  &k  是取变量  k  (前提是  k  是一个  int  类型的变量)的地址操作符。

 int *p = &k;  这条语句的作用是把变量  k  的地址赋值给指针变量  p  ,也就是让指针  p  指向变量  k。下图是初始时定义完后的结果。

 执行*p1=*p3,*p3=*p1;后

p1中存储的是n的地址,p2中存储的是m的地址,p3中存储的也是n的地址。

if(p1==p3)表示的是p1的地址是否与p3的地址相同,虽然p1,p3中存储的都是n的地址,但是他们本身的地址是不同的(相当于p1是第一层的房子,p3是第三层的房子,虽然这两个房子里的东西是一样的,但是他们的地址不一样)

最后输出的是6,4,6

 

这一题r=p,p=q,p=r;交换的是他们彼此的地址(也可以理解为门牌号)

 

*p表示从门牌号为p的地方取东西 

3

 (3)*  和  ++  都是右结合性。

(5)  p  是一个字符指针变量,它可以指向不同的字符数组或字符串常量。 "abcd"  是一个字符串常量,其存储在内存的常量区,有对应的首地址。 p = "abcd"  这条语句是将字符串  "abcd"  的首地址赋给指针变量  p ,使  p  指向该字符串常量。

4.char str[5]={'a','b','c','d','e'};

- 对于字符数组初始化,如果用字符常量初始化,要考虑字符数组的长度与所赋字符的个数及字符串结束标志 '\0' 的关系。

- 在C语言中,字符串是以 '\0' 作为结束标志的。当我们定义一个字符数组用来存储字符串时,数组的长度至少要比实际存储的字符个数多1 ,以便存放结束标志 '\0' 。

char *str;str="abcde";

这样定义是对的

5

(10)

定义了行指针 int (*p)[4] = a; ,这表示 p 是一个指针,它指向包含4个 int 类型元素的一维数组,并且 p 指向了二维数组 a 的首行(即 a[0] 这一行)。

A选项语法错误

分析选项B:

-  p++, *(p + 1)  是逗号表达式。逗号表达式会从左到右依次计算各个表达式,并且整个逗号表达式的值是最后一个表达式的值。

- 首先 p++ , p 是行指针, p++ 会使 p 指向 a 的下一行(即从指向 a[0] 变为指向 a[1] ),但 p++ 这个表达式的值是 p 自增前的值(即指向 a[0] 的指针),这里只是让 p 发生了移动。

- 然后 *(p + 1) ,此时 p 已经指向 a[1] , p + 1 指向 a[2] , *(p + 1) 得到的是 a[2] ( a[2] 是包含4个 int 类型元素的一维数组名,在这里退化为指向 a[2][0] 的指针),而不是我们想要的数值4,所以B选项错误。

正确选到4的操作是*(*(p+1)+1)

分析选项C:

-  a[2][2] , a 是二维数组, a[2] 表示第三行, a[2][2] 表示第三行第三个元素。

- 由于数组初始化时,第三行只初始化了 a[2][0] = 5 , a[2][1] = 8 ,未初始化的 a[2][2] 值为0,不是4,所以C选项错误。

分析选项D:

- 因为 p 指向 a (即 p 指向 a[0] 这一行), p[1] 就相当于 a[1] (指向二维数组 a 的第二行)。

- 那么 p[1][1] 就相当于 a[1][1] ,而 a[1] 初始化为 {2, 4} ,所以 a[1][1] 的值为4,D选项正确。

(12)

A.例如,若两个指针都指向同一个数组中的元素,通过 < 可以判断它们指向元素的先后顺序。

B.可以将一个指针变量的值(即它所指向的内存地址)赋给另一个基类型相同的指针变量,使它们指向同一个内存位置。

C.因为指针变量存储的是内存地址,对指针进行加法运算在C语言中没有明确的、通用的数学或逻辑意义。不像数组指针进行偏移(如 p + n ,这里 p 是指向数组的指针, n 是整数,它是基于数组元素大小进行偏移的特殊运算,但不是单纯的指针加法)。单纯的两个指针相加没有定义

D.当两个指针指向同一个数组中的元素时,它们相减的结果是两个指针之间相差的元素个数。

6

void *fun()

 void *  是一种通用型指针类型.它可以指向任何类型的数据。当一个函数的返回值类型声明为void *  时,就意味着该函数的返回值是一个通用型的指针。

char *aa[2]={"abcd","ABCD"}; 

-  aa  是一个数组, [2]  表示数组有2个元素。数组元素的类型是  char * ,即字符型指针。

- 这里用字符串常量  "abcd"  和  "ABCD"  初始化数组  aa 。在C语言中,字符串常量存储在内存的静态存储区,并且编译器会为每个字符串常量分配一段连续的内存空间,同时,字符串常量名代表该字符串的首地址(也就是第一个字符的地址)。

- 所以  aa[0]  被初始化为字符串  "abcd"  的首地址(即字符  'a'  的地址), aa[1]  被初始化为字符串  "ABCD"  的首地址(即字符  'A'  的地址)。

 c错的原因是str4没有明确的指向。

7.

 (4)

- 函数指针的定义形式为:函数返回值类型 (*指针变量名)(函数参数类型列表)。

- 函数名本身就代表函数的入口地址,要把函数  min  赋给函数指针  p_min ,直接使用赋值语句: p_min = min;  。

- 调用函数指针指向的函数的形式为:(*指针变量名)(实参列表)。

 

8

9

 D.代码中声明了整型变量 a 并初始化,也声明了整型指针 p ,但指针 p 未初始化,即没有指向任何有效的内存地址。此时执行 *p = a; 是危险的,会导致程序试图向一个不确定的内存地址写入数据,可能引发段错误等运行时错误,甚至可能破坏其他程序数据或导致程序崩溃。

10.指针运算的优先级

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值