当前位置:网站首页>c指针学习(2)

c指针学习(2)

2022-08-11 05:15:00 阳光男孩cony

(1)逗号运算符

int main() {
    
	int a[3][2] = {
     (0,1),(3,4),(5,6) };
	int* pt = a[0];
	printf("%d", pt[0]);
	//输出1
}

在这个题中主要注意的是(0,1),(3,4),(5,6),使用的是小括号所以其意义为逗号运算符,最后存入数组的数为{1,4,6}。p[0]=*(p+0)

(2)指针直接访问字符串

int main() {
    
        char str1[] = "hallo word";
        char str2[] = "hallo word";
        const char* str3 = "hallo word";
        const char* str4 = "hallo word";
        if (str1 == str2) {
    
                printf("same");
        }else{
    
                printf("not same");
        }printf("\n");
        if (str3 == str4) {
    
                printf("same");
        }
        else {
    
                printf("not same");
        }
        return 0;
        //输出
        //not same
        //same
}

前者输出not same毋庸置疑的,(将字符串放入数组中,str1与str2都是指向个数组的首元素的地址。)
后者输出same,是因为被指针直接访问的字符串是const的(存放在内存中静态区域),如对其进行修改也是会报错的。

(3)

	int main() {
    
		int a[5][5] = {
     0 };
		int(*p)[4] = a;
		printf("%p,%d", &a[4][2]- &p[4][2],&a[4][2] - &p[4][2]);
		printf("%p,%d", &p[4][2]- &a[4][2],&p[4][2] - &a[4][2]);
	}
	//输出: 00000004 4
	// FFFFFFFC -4

首先明白int(*p)[4]是一个数组指针而不是指针数组,int(*p)[4] = a; p中存储的是a数组的首地址,对于p而言其类型是,行储存容量为4,而原数组,行存储容量为5。
其次明白p[4][2]的意义是*(*(p+4)+2),而&p[4][2]*(p+4)+2
还有明白%p%d的不同之处,对于前者是将内存中,该储存的16进制数完完整整的输出。后者则是根据整数输出的流程进行输出。
知道上面就可以进行计算了:a[5][2]指向的是a数组的第22位,而p[4][2]指向的是a数组的第18位。两者的位数差为4,所以&a[4][2] - &p[4][2]对于4

原网站

版权声明
本文为[阳光男孩cony]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_53922439/article/details/125605512