图中的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.指针运算的优先级