- Tìm số 0 đầu tiên trong một mảng bit
- Unix Hiển thị thông tin về các tập tin khớp với một trong hai mẫu
- Biểu thức chính quy thay thế nhiều tệp
- Ẩn lệnh từ xtrace
我有一个关于 C/C++ 如何在内部存储使用符号 foo[m][n]
声明的多维数组的问题。我不是在质疑指针等的纯指针......我是因为速度原因而问......
如果我错了请纠正我,但语法上 đồ ăn
是一个指针数组,它们本身指向一个数组
int foo[5][4]
*(foo + i) // returns a memory address
*( *(foo + i) + j) // returns an int
我从很多地方听说C/C++编译器在后台将foo[m][n]
转换为一维数组(用i计算需要的一维索引* 宽度 + j
)。但是,如果这是真的,那么以下内容将成立
*(foo + 1) // should return element foo[0][1]
因此我的问题是:foo[m][n]
是否(总是?)作为平面一维数组存储在内存中?如果是这样,为什么上面的代码会像所示的那样工作。
1 Câu trả lời
一个二维数组:
int foo[5][4];
只不过是一个数组的数组:
typedef int row[4]; /* type "row" is an array of 4 ints */
row foo[5]; /* the object "foo" is an array of 5 rows */
这里没有指针对象,无论是显式的还是隐式的。
数组不是指针。指针不是数组。
经常引起混淆的是,在大多数上下文中,数组表达式 被隐式转换为指向其第一个元素的指针。 (还有一条单独的规则说,看起来像数组参数声明的实际上是指针声明,但这不适用于此示例。)数组 sự vật 是数组对象;声明这样的对象不会创建任何指针对象。引用一个数组对象可以创建一个指针giá trị(数组第一个元素的地址),但是内存中没有存储指针对象。
数组对象 đồ ăn
在内存中存储为 5 个连续的元素,其中每个元素本身就是一个由 4 个连续的 số nguyên
元素组成的数组;因此,整个事情存储为 20 个连续的 số nguyên
sự vật.
索引运算符是根据指针算法定义的; x[y]
等同于 *(x + y)
。通常,左操作数将是指针表达式 hoặc 数组表达式;如果它是一个数组表达式,则该数组被隐式转换为一个指针。
因此 foo[x][y]
Tương đương với *(foo[x] + y)
,后者又等价于 *(* (foo + x) + y)
。 (请注意,不需要强制转换。)幸运的是,您不必那样写,而且 foo[x][y]
更容易理解。
请注意,您Có thể创建一个可以使用相同的 foo[x][y]
语法访问的数据结构,但是 đồ ăn
实际上是一个指向 int 的指针。 (在那种情况下,每个 []
运算符的前缀已经是一个指针表达式,不需要转换。)但是要做到这一点,你必须声明 đồ ăn
作为一个指向整数的指针:
int **foo;
然后分配并初始化所有需要的内存。这比 int foo[5][4]
更灵活,因为您可以动态确定行数和每行的大小(甚至存在)。
comp.lang.c FAQ 的第 6 节很好地解释了这一点。
biên tập:
在回应 Arrakis 的评论时,请务必牢记类型 Vàthể hiện 之间的区别。
比如这两种:
struct pair { int x; int y;};
typedef int arr2[2];
很可能在内存中具有相同的表示(两个连续的 số nguyên
对象),但访问元素的语法却完全不同。
类似地,int[5][4]
Và int[20]
类型具有相同的内存布局(20 个连续的 số nguyên
对象),但访问元素的语法不同。
BạnCó thể访问foo[2][2]
BẰNG((int*)foo)[10]
(处理2-维数组,就好像它是一维数组一样)。有时这样做很有用,但严格来说行为是未定义的。您可能会逃避它,因为大多数 C 实现不进行数组边界检查。另一方面,优化编译器可以假定您的代码行为已定义,如果未定义则生成任意代码。
关于C/C++ 多维数组内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7784758/
Tôi đang cố gắng tạo một mảng chứa các mục int[][] tức là int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
Tôi có một mảng các số nguyên: private int array[]; Nếu tôi cũng có một phương thức gọi là add, thì sự khác biệt giữa: public void add(int value) { array[value
Khi bạn cố gắng thêm một mảng vào một mảng khác trong JavaScript, nó sẽ chuyển đổi mảng đó thành một chuỗi. Thông thường khi thực hiện việc này bằng ngôn ngữ khác, các danh sách sẽ được hợp nhất. JavaScript [1, 2] + [3, 4] = "
Theo hướng dẫn tôi đang đọc, nếu bạn muốn tạo một bảng có 5 cột và 3 hàng để biểu diễn dữ liệu như thế này... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...nó nói rằng bạn có thể sử dụng như sau
Tôi thường viết tập lệnh/chương trình bằng Python nhưng gần đây tôi bắt đầu lập trình bằng JavaScript và gặp một số vấn đề khi làm việc với mảng. Trong python, khi tôi tạo một mảng và sử dụng for x in y, tôi nhận được
Tôi có một mảng như thế này: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // Tôi muốn sử dụng toStr
rent_property (tên bảng) id fullName propertyName 1 A House Name1 2 B
Câu hỏi này đã có câu trả lời ở đây: Đã đóng cách đây 13 năm. Có thể trùng lặp: Trong mảng C tại sao điều này lại đúng? a[5] == 5[a] mảng[chỉ số] và
Sử dụng Excel 2013. Bài đăng đầu tiên của tôi sau nhiều năm tìm kiếm và chỉnh sửa. Tôi đang cố gắng khớp người dùng ứng dụng hiện tại (tức là "John Smith") với địa chỉ email "jsmith@work.com" của anh ấy. Sử dụng hai
apply dường như không lắp ráp lại mảng 3D khi chỉ hoạt động trên một lề. Hãy xem xét: arr 1), nhưng tôi vẫn thấy lạ rằng nếu một hàm trả về một đối tượng có kích thước, thì về cơ bản chúng sẽ bị bỏ qua. Câu trả lời tốt nhất là điều này hơi vô lý
Tôi có cơ sở dữ liệu MySQL chứa tọa độ GPS. Đây là một phần mã PHP của tôi để lấy tọa độ; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
Tôi cần tìm cách thực hiện thao tác này trong đó tôi có một mảng có dạng [batch_size, 150, 1] biểu diễn các chuỗi số nguyên batch_size, mỗi chuỗi dài 150 phần tử, nhưng trong mỗi chuỗi có rất nhiều số 0 được thêm vào để tất cả các chuỗi có cùng một
Tôi phải lấy văn bản thông qua json trong url. Hệ thống phân cấp như sau: đối tượng > mảng > đối tượng > mảng > đối tượng. Tôi muốn lấy văn bản bằng mã này. Nhưng tôi nhận được lỗi: org.json.JSONException: Không có giá trị
nhập mã ở đây- (void)viewDidLoad { NSMutableArray *imageViewArray = [[NSMutableArray alloc] init];
Bạn có biết cách thực hiện thao tác cắt trên mảng chuỗi 2 chiều, chẳng hạn như 3x3 và thu thập lại thành mảng 3x3 có cùng kích thước bằng cách sử dụng Java Stream API không? Vấn đề là tránh sử dụng vòng lặp for rõ ràng. Giải pháp hiện tại chỉ đơn giản là thực hiện một fo
Đã đóng. Sự cố này cần có thông tin chi tiết để gỡ lỗi. Hiện tại không chấp nhận câu trả lời. Chỉnh sửa câu hỏi để bao gồm hành vi mong muốn, một vấn đề hoặc lỗi cụ thể và
Tôi có đầu ra XML sau từ Dịch vụ Web ASP.NET: 1710 1711 1712 1713
Nếu tôi có một đối tượng todo như một phần của trạng thái của bạn và đối tượng đó chứa một mảng danh sách, bên trong danh sách có các đối tượng và bên trong các đối tượng đó có một mảng listItems khác. Làm thế nào để cập nhật đối tượng có id "poi098" trong mảng listItems
Tôi muốn đóng gói một mảng bool có độ dài tối đa là 8 vào một byte, gửi nó qua mạng rồi giải nén lại thành một mảng bool. Đã thử một số giải pháp ở đây nhưng không có hiệu quả. Tôi đang sử dụng mono. Tôi đã tạo BitArray, và sau đó thử
Chúng tôi có trường này trong cơ sở dữ liệu biểu thị cờ đúng/sai cho mỗi ngày trong tuần, như thế này: '1111110' Tôi cần chuyển đổi giá trị này thành một mảng boolean. Để thực hiện điều này, tôi đã viết đoạn mã sau: char[] freqs = weekday
Tôi là một lập trình viên xuất sắc, rất giỏi!